C: fread() 在读取 .raw 文件时总是返回 0

Posted

技术标签:

【中文标题】C: fread() 在读取 .raw 文件时总是返回 0【英文标题】:C: fread() always returns 0 when reading a .raw file 【发布时间】:2022-01-11 02:28:15 【问题描述】:

我知道这个问题已经被问过几次了,但是没有一个对我有用。我有一个带有 2 个 int 变量和一个 unsigned char 指针的结构,我正在创建一个指向该结构的指针。然后我想修改 2 个 int 变量的值,并使用 fread() 获取一个 .raw 文件(位于资源文件文件夹中,也许它需要在其他地方?)并将其放入 unsigned char 指针中。但是 fread() 总是返回 0,当我尝试在结构指针上使用 free() 时程序崩溃。到目前为止,这是我的代码:

结构:

typedef unsigned char UCHAR;
struct IMAGERAW

    int height;
    int width;
    UCHAR* image;
;
typedef struct IMAGERAW IMAGE;

主要:

int main()

    IMAGE *img;
    img = read_image();


    free(img->image);
    free(img);

read_image():

IMAGE *read_image()

    IMAGE* img;
    FILE* fpI;
    int height = 1409;
    int width = 1690;
    int freadReturn;

    fpI = fopen("file.raw", "rb");


    img = (IMAGE*)malloc(sizeof(IMAGE));
    img->height = height;
    img->width= width;
    freadReturn = fread(img->image, sizeof(UCHAR), img->height * img->width, fpI);
    printf("fread() returns : %d", freadReturn);
    fclose(fpI);

    return img;

freadReturn 变量总是设置为 0(我认为应该设置为 height * width),并且程序在“free(img->image);”行给出了错误。尺寸是正确的,如果我更改它们,程序会更早崩溃,文件名也是如此,所以我真的不知道我做错了什么。提前致谢!

【问题讨论】:

img->image 只是一个指针。我看不到您为它应该指向的字节分配空间。 @BoP 是的,我刚刚意识到......不知道我是怎么错过的。 read_image() 也返回一个本地指针。此变量现在超出范围,因此您不应使用 main() 中的值 fpI = fopen("file.raw", "rb"); 文件在没有路径的情况下打开,因此系统将尝试在“当前目录”中找到它,无论是什么。众所周知,某些 IDE 会将其移动到各处。不保证它是可执行文件的目录,所以在使用它之前测试返回值是个好主意。 @jmq read_image() 返回恰好是通过 malloc() 获得的指针的局部变量的 VALUE。这还不错。 【参考方案1】:

正如@BoP 提到的,我不知何故忘记为结构的 unsigned char 指针分配内存。所以我加了

img->image = (UCHAR*)malloc(img->height * img->width);

就在 fread() 行的上方,现在 fread() 返回一个正确的值。

【讨论】:

以上是关于C: fread() 在读取 .raw 文件时总是返回 0的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 fread 读取 R 中的 gz 文件?

使用 C 将 .raw 文件数据存储为指针

C 编程中的 fread 函数

fread()函数如何判断是不是到文件末尾?

C 语言文件操作 ( fread 函数 )

fread函数的用法