c - 尽管说它读取了 4096 字节,但 fread 在我的缓冲区中没有返回任何数据

标签 c macos fread

我正在移植一些从包含多个位图的文件中加载 Sprite 的 C 代码。基本上代码 fopens 文件,fgetcs 一些头信息,然后 freads 位图数据。我可以看到 fgetcs 正在返回正确的数据,但 fread 的结果为空。这是代码 - fname 确实存在,路径是正确的,fil 是非零的,num 是文件中 Sprite 的数量(编码到标题中,小端),pak 是一个 Sprite 数组,sprite 是一个 typedef宽度、高度和位数,而 new_sprite 为您初始化。

FILE *fil;
uint8 *buffu;
uint8 read;
int32 x,num;
int32 w,h,c;

fil = fopen(fname, "rb");
if (!fil) return NULL;

num = fgetc(fil);
num += fgetc(fil)*256;
if (num > max) max = num;

for (x=0;x<max;x++) {
    // header
    w=fgetc(fil);
    w+=fgetc(fil)*256;
    h=fgetc(fil);
    h+=fgetc(fil)*256;
    fgetc(fil); // stuff we don't use
    fgetc(fil);
    fgetc(fil);
    fgetc(fil);
    // body
    buffu = (uint8*)malloc(w * h);
    read=fread(buffu,1,w*h,fil);
    pak->spr[x]=new_sprite(w,h);
    memcpy(pak->spr[x]->data, buffu, w*h);
    // done
    free(buffu);
}

我逐行检查了这段代码,我可以看到 w 和 h 设置正确,并且 read=4096,这是正确的位数。但是,buffer 在 fread 之后是 "",所以 memcpy 当然没有任何用处,我的 pak 中充满了空 Sprite 。

对于这肯定是一个完全菜鸟的问题,我深表歉意,但我通常使用 Cocoa,所以这种纯 C 文件处理对我来说是新的。我到处寻找 fread 的示例,它们看起来都像这里的那个 - 显然在 Win32 上运行良好。

最佳答案

因为 fgetc 似乎可以工作,你可以试试这个作为测试

int each;
int byte;

//body
buffu = malloc(w * h);
for (each = 0; each < w*h; each++) {
    byte = fgetc(fil);
    if ( byte == EOF) {
        printf("End of file\n");
        break;
    }
    buffu[each] = (uint8)byte;
    printf ("byte: %d    each: %d\n", byte, each);
}
pak->spr[x]=new_sprite(w,h);
memcpy(pak->spr[x]->data, buffu, w*h);
// done

关于c - 尽管说它读取了 4096 字节,但 fread 在我的缓冲区中没有返回任何数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24430653/

相关文章:

xcode - 在 Mac 上开发和调试 KEXT

c - 如何使用 C 中的结构创建数据库

c++ - 以 200 字节为单位读取二进制文件

c - 在C中打印字符串的地址是否有效

c++ - 使用CUDA convnet库编译错误

c - 在函数上使用 sizeof 的输出

macos - 如何在mac中设置默认WIFI网络?

c - c 中的 fread 未读取完整文件

c - select(2)为什么叫 "synchronous"多路复用?

c - 运行计时器 30 秒