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);
}

posted @ 2012-08-12 17:15  wmx3ng  阅读(8028)  评论(0编辑  收藏  举报