c语言编程文件操作问题

struct Files
{
long int off;
long int size;
char name[24];
char tmp[32];
}file[32];
//定义包中每个文件的描述部分总共64字节
for(i=0;i<(H.filenum);i++)
{
fread(&file[i],sizeof(file[i]),1,fp);
printf("%ld\n%ld\n%s\n",file[i].off,file[i].size,file[i].name);
}//读取并输出每个文件的信息
到第12个文件时,总是在文件大小就出现不对了,然后后面就都错了
到底哪里弄错了,请高手指点下(图片是包文件)

应该是你的数据文件出问题了
出问题的可能原因:
可能一: char name[24]; //第11个或第12个的文件名过长,超过了23个字节
可能二: char tmp[32]; //第11个或第12个的tmp数据长度超过了31个字节
检查一下生成文件的那个程序吧,把这块的信息长度输出出来调试一下。追问

图片就是那个文件的数据,出错是从那个font12a12文件后面那个文件开始的,读取off正常,size时就错误了,后面就全错了

追答

把你的程序这样修改一下,调试看看
/**
for(i=0;i<(H.filenum);i++)
{
fread(&file[i],sizeof(file[i]),1,fp);
printf("%ld\n%ld\n%s\n",file[i].off,file[i].size,file[i].name);
}
**/

for(i=0;i<(H.filenum);i++)
{
//看一下出错时,返回的ret读到的字节值,正常时应该==SIZE
int ret=fread(&file[i],1,sizeof(file[i]),fp);
//输出每个数组元素的首地址和STRUCT大小
//正常情况:SIZE=64 , 地址2-地址1=64
printf("addr=%08X sizeof(file[i])=%d\n" , &file[i] , sizeof(file[i]) );
printf("ret=%d %ld\n%ld\n%s\n",ret, file[i].off,file[i].size,file[i].name);
}

追问

我在书上也看到过说结构体的大小不稳定,可能就不是实际成员大小之和,这样的话,我该怎么写这程序呀?

追答

“结构体的大小不稳定,可能就不是实际成员大小之和”
这句话不能这样说!
结构体在存储数据时,为了方便数据的存取(可能原因),计算机在设计它的空间分配时是有一定的算法的,所以,当你定义不同的数据类型到结构中时,因为数据类型的排列位置的不同,都会导致结构体所占空间大小不同。
但是,对于给定的结构体,运行过程中,它的大小是固定的!
你根据我上面提供的调试方法先看一下,输出的调试数据是否与想象的一致,如果有不一致,再找原因。
还有,你的数据文件是怎样生成的,是在同一台机器上用相同的程序结构生成的吗?如果不同,那就是机器间的差异!(64位机与32位机差异很大)

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-09-29
把一堆结构放在一个文件里的时候,最好自定义一个结尾。读到指定字符表示已读取完成追问

图片就是那个文件的数据,出错是从那个font12a12文件后面那个文件开始的,读取off正常,size时就错误了,后面就全错了,如果要加结尾,怎么加?请指教一下

相似回答