【问题标题】:C: fread() always returns 0 when reading a .raw fileC: fread() 在读取 .raw 文件时总是返回 0
【发布时间】: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。这还不错。

标签: c pointers


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 2020-05-20
    • 2021-12-14
    • 2014-06-10
    • 1970-01-01
    相关资源
    最近更新 更多