c fread()在判断文件结束时需要注意的一些事
样本程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
int ele1;
int ele2;
char ch[20];
}ttt; //结构体.
void addInfo(int *n)
{
FILE *file=fopen("wmx.dat","w");
int i=0;
ttt myttt;
for(i=0;i<10;i++) //初始化文件,输入10条记录.
{
myttt.ele1=((i+100)*7+i)%107;
myttt.ele2=((i+309)*5+65)%43;
strcpy(myttt.ch,"dkldfjd");
(*n)++;
fwrite(&myttt,sizeof(ttt),1,file); //写入.
}
fclose(file);
}
void readFile(int *n)
{
FILE *file=fopen("wmx.dat","r");
ttt myttt;
if(file==NULL)
{
printf("打开文件失败.\n");
exit(0);
}
while(!feof(file)) //此处打印的最结果是11条记录.
{
fread(&myttt,sizeof(ttt),1,file);
printf("%d %d %s\n",myttt.ele1,myttt.ele2,myttt.ch);
// (*n)++;
}
fclose(file);
}
int main()
{
int n=0;
addInfo(&n);
readFile(&n);
printf("%d\n",n);
return 0;
}
问题处在fread上,用feof判断有问题,可以改为:
while (1)
{
memset(&myttt, 0, sizeof(myttt));
if (fread(&myttt, sizeof(ttt), 1, file) == 1)
{
printf();
}
else
{
break;
}
}
原因:feof(file) 的作用是检测读取到的数据是否为文件结束。读完最后一行记录后,file->_flag 没有被置为_IOEOF,因为已经读取到记录了, feof() 没有探测到文件结尾。直到再次调用 fread()读取记录时,才获取文件结束标志,feof() 探测到文件结尾。
当再次调用 fread(&myttt,sizeof(ttt),1,file); 时,myttt 没有获取任何内容,还是上次读取的数据,输出时,当然是跟上次一样。
修改如下:
void readFile(int *n)
{
FILE *file=fopen("wmx.dat","r");
ttt myttt;
if(file==NULL)
{
printf("打开文件失败.\n");
exit(0);
}
// 检测文件长度,如果大于 0,先读取一行。
if(file->_bufsiz>0)
{
fread(&myttt,sizeof(ttt),1,file);
}
while(!feof(file)) //此处打印的最结果是11条记录.
{
printf("%d %d %s\n",myttt.ele1,myttt.ele2,myttt.ch);
// 当读取完数据后,读取出文件结束标志,
// 回到 while 时,就不再输出下一行了。
fread(&myttt,sizeof(ttt),1,file);
}
fclose(file);
}