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

用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失败之后才设文件终结符的,这样在最后一个数据读完后还会再执行一次循环.

你可能感兴趣的:(c,struct,存储,语言,通讯)