易截截图软件、单文件、免安装、纯绿色、仅160KB

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/C++程序员面试题

 1、局部变量能否和全局变量重名?  
 答:能,局部会屏蔽全局。要用全局变量,需要使用"::" ;局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那 ......

linux c socket 开发与编译实例

这篇日志还是先从一个能够运行起来的例子出发,一旦能顺利的看到程序的成功运行,那么接下来的事件我想应该是问为什么了?似乎这样更加容易理解和掌握。
对于socket程序的概念这里就不多写了,但我相信,如果能看完这整篇文章,我相信不会再有这样的疑问的。
下面将编写一个c/s结构的程序,主要功能是client将向server发� ......

C/C++面试题

1.介绍一下STL,详细说明STL如何实现vector.
    Answer:
    STL (标准模版库,Standard Template Library.它由容器算法迭代器组成。
    STL有以下的一些优点:可以方便容易地实现搜索数据或对数据排序等一系列的算法;调试程序时更加安全 和方便;即使是人们用STL在 ......

C库函数字符串处理函数的C实现(常见)

1.strlen()
实现:
    size_t  strlen(const char *s)
    {
       size_t n;
       for(n = 0; *s != '\0'; s++)
          ++n;
       return n;
  ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号