读写二进制文件时出错
从键盘输入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 置位,
这个时候,已经多读取了一次文件内容 ~~