我正在移植一些从包含多个位图的文件中加载 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/