尽管fread说它读取4096字节,但fread不会在我的缓冲区中返回任何数据

时间:2014-06-26 12:33:01

标签: c macos fread

我正在移植一些C代码,用于从包含多个位图的文件中加载精灵。基本上代码fopens文件,fgetcs一些头信息,然后freads位图数据。我可以看到fgetcs正在返回正确的数据,但是fread的结果是null。这里是代码 - fname确实存在,路径是正确的,fil是非零的,num是文件中精灵的数量(编码到头部,little-endian),pak是精灵数组,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正在设置正确,并且读取= 4096,这是正确的位数。但是,在fread之后缓冲区是"",所以当然memcpy没有任何用处,而且我的pak中充满了空精灵。

我对这肯定是一个完全没有问题的人表示道歉,但我通常使用Cocoa,所以这个纯C文件处理对我来说是新的。我看了很多关于fread的例子,它们看起来都像这里的那个 - 显然在Win32上工作正常。

2 个答案:

答案 0 :(得分:1)

你说:

  

然而,缓冲区是&#34;&#34;在恐惧之后,当然memcpy没有任何用处

但事实并非如此。 memcpy()不是字符串函数,它将复制请求的字节数。每次。如果那不是有用的&#34;,那么别的东西就错了。

你的缓冲区,当被视为一个字符串(它不是,它是一堆二进制数据)时,如果是第一个,它将看起来像一个空字符串字节恰好是0.剩下的4095字节可以是任何东西,对于C&C的字符串打印功能,它看起来像是空的&#34;。

答案 1 :(得分:1)

由于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