六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 24|回复: 0

c 语言中fread()函数使用时应该注意的地方

[复制链接]

升级  49%

233

主题

233

主题

233

主题

进士

Rank: 4

积分
745
 楼主| 发表于 2013-1-26 13:54:31 | 显示全部楼层 |阅读模式
用c语言做了个通讯录,系统一运行时便将数据文件加载进内存,并用链表存储。退出系统时,自动将链表中的所有节点再存入文件。

可是现在,每次退出系统,文件里都会比链表多存储一条记录。
如:现在只有两条记录,退出后在启动时一查询,就会多一条乱记录(系统自己加的)。
加载文件的部分代码如下:
/*判断文件是否为空*/
  fseek(groupfp,0,2);/*指针指向group.dat文件尾部*/
  fseek(linkmanfp,0,2);/*指针指向linkman.dat文件尾部*/
  if(ftell(groupfp)>0){ /*文件非空*/
  rewind(groupfp);/*文件指针重新指向文件开始处*/
  /*下面要装载该文件到group链表中*/
  while(!feof(groupfp)){
      p=(GroupNote)malloc(sizeof(struct groupnote));
      fread(p,sizeof(struct groupnote),1,groupfp);
      p->next=NULL;/*刚读取进来的指针是上一次的,所以重新赋值为空*/
      gn->next=p;
  gn=p;/*尾插法*/
  /*注意:p->next上面已经赋值为空了,所以这里不需要再次赋值了*/
  group.length++; /*链表长度加1*/
  }/*while*/
  group.tail=gn;/*将尾指针指向group链表的结尾*/

fread(p,sizeof(struct groupnote),1,groupfp);
改成
if (fread(p,sizeof(struct groupnote),1,groupfp) != 1) {
  free(p);
  break;
}

这是因为有些库函数的写法,是在fread失败之后才设文件终结符的,这样在最后一个数据读完后还会再执行一次循环.
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表