• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

cfread()在判断文件结束时需要注意的一些事

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

样本程序如下:

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C语言博客作业04--数组发布时间:2022-07-13
下一篇:
基于C#的接口自动化测试(一)发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap