我正在移植一些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上工作正常。
答案 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