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的主要内容,如果未能解决你的问题,请参考以下文章