首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

读写二进制文件时出错,该怎么处理

2012-02-02 
读写二进制文件时出错从键盘输入10个数以二进制形式写到文件中,再把它读出来输出进却多了一个,不知为什么,

读写二进制文件时出错
从键盘输入10个数以二进制形式写到文件中,再把它读出来输出进却多了一个,不知为什么,请教各位高手,谢谢!!代码如下:

#   include   <stdio.h>
main()
{
float   f[10],fo[10],f4;
int   i=0;
FILE   *   fp;
printf( "input   ten   number:\n ");

if((fp=fopen( "float.dat ", "wb "))!=NULL)
{
while(i <10)/*只输入10个数,下标从0-9*/
{
scanf( "%f ",&f[i]);
fwrite(&f[i],sizeof(f[i]),1,fp);
i++;
}
printf( "\ni=%d\n ",i);
}
else
printf( "cann 't   open   this   file!\n ");
fclose(fp);
if((fp=fopen( "float.dat ", "rb "))!=NULL)
{
i=0;
while(!feof(fp))/*应该输出10个数,可实际输出了11个数*/
{
fread(&fo[i],sizeof(fo[i]),1,fp);
printf( "%6.2f ",fo[i]);
i++;
}
printf( "\ni=%d\n ",i);/*   i应该是10,但也变成11了*/
}
else
printf( "cann 't   open   this   file! ");
fclose(fp);

if((fp=fopen( "float.dat ", "rb+ "))!=NULL)
{       /*改写文件中的第四个数据后再输出到屏幕*/
fseek(fp,3L*sizeof(float),SEEK_SET);
printf( "input   changed   number: ");
scanf( "%f ",&f4);
fwrite(&f4,sizeof(f4),1,fp);
fseek(fp,0L,SEEK_SET);
i=0;
printf( "the   changed   number:\n ");
while(!feof(fp))
{
fread(&fo[i],sizeof(fo[i]),1,fp);
printf( "%6.2f ",fo[i]);
i++;
}
}
else
printf( "cann 't   open   file!\n ");
fclose(fp);
printf( "\n ");
}

[解决办法]
读写二进制文件不要用feof(fp),因为他碰见某些字符就认为文件结束了, 而二进制文件从0x00到0xff都有可能,替代求文件大小
fseek ( fp , 0 , SEEK_END );
len = ftell ( fp );
rewind(fp);//如需要,再把文件指针归零
[解决办法]
while(!feof(fp))/*应该输出10个数,可实际输出了11个数*/
{
fread(&fo[i],sizeof(fo[i]),1,fp);
printf( "%6.2f ",fo[i]);
i++;
}

这样的判断 eof ,
总是滞后的。

因为feof(fp)是在 出错后(比如读取过程超过了文件末尾)才对 flag 置位,
这个时候,已经多读取了一次文件内容 ~~

热点排行