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

C fread在我的缓冲区中不返回任何数据,尽管说它读取了4096字节,c,macos,fread,C,Macos,Fread,我正在移植一些C代码,从包含多个位图的文件中加载精灵。基本上,代码打开文件,fgetcs一些头信息,然后释放位图数据。我可以看到FGETC正在返回正确的数据,但fread的结果为空。下面是代码-fname确实存在,路径正确,fil不为零,num是文件中精灵的数量(编码到头文件中,little endian),pak是精灵数组,sprite是宽度、高度和位的typedef,new_sprite inits一个 FILE *fil; uint8 *buffu; uint8 read; int32 x

我正在移植一些C代码,从包含多个位图的文件中加载精灵。基本上,代码打开文件,fgetcs一些头信息,然后释放位图数据。我可以看到FGETC正在返回正确的数据,但fread的结果为空。下面是代码-fname确实存在,路径正确,fil不为零,num是文件中精灵的数量(编码到头文件中,little endian),pak是精灵数组,sprite是宽度、高度和位的typedef,new_sprite inits一个

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);
}
文件*fil;
uint8*buffu;
uint8读取;
int32x,num;
int32 w,h,c;
fil=fopen(fname,“rb”);
如果(!fil)返回空值;
num=fgetc(fil);
num+=fgetc(fil)*256;
如果(num>max)max=num;
对于(x=0;x你说:

但是,缓冲区在fread之后是“”,因此memcpy当然没有任何用处

但事实并非如此。
memcpy()
不是一个字符串函数,它每次都会复制请求的字节数。如果这不是“有用的”,则说明其他问题


如果第一个字节恰好为0,则将缓冲区视为字符串(不是,它是一组二进制数据)时将看起来像一个空字符串。剩余的4095字节可以是任何字节,对于C的字符串打印函数,它将看起来是“空的”。

既然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
int;
整数字节;
//身体
buffu=malloc(w*h);
对于(每个=0;每个spr[x]=新精灵(w,h);
memcpy(pak->spr[x]->数据,buffu,w*h);
//完成

如果将缓冲区视为字符串,请注意,如果它看到NUL字节,字符串表示将被切断。最好检查原始内存以确定。哦,天哪,如果是这样,我觉得自己真的很笨。使用lldb,(gdb),查看原始数据的命令是什么?不,它肯定都是空的,我循环并打印了buffu。为什么要将
read
声明为
uint8
?这个变量如何能够容纳4096?“read=4096,这是正确的位数”。有问题。
read
无法保存值4096,并且
fread
返回读取的项数(此处:字节),而不是位。这说明了问题,但正确查看它的解决方案是什么?太好了!我一直在获取数据。另一个调试器混乱。