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失败之后才设文件终结符的,这样在最后一个数据读完后还会再执行一次循环.
相关文档:
1、局部变量能否和全局变量重名?
答:能,局部会屏蔽全局。要用全局变量,需要使用"::" ;局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那 ......
这篇日志还是先从一个能够运行起来的例子出发,一旦能顺利的看到程序的成功运行,那么接下来的事件我想应该是问为什么了?似乎这样更加容易理解和掌握。
对于socket程序的概念这里就不多写了,但我相信,如果能看完这整篇文章,我相信不会再有这样的疑问的。
下面将编写一个c/s结构的程序,主要功能是client将向server发� ......
1.介绍一下STL,详细说明STL如何实现vector.
Answer:
STL (标准模版库,Standard Template Library.它由容器算法迭代器组成。
STL有以下的一些优点:可以方便容易地实现搜索数据或对数据排序等一系列的算法;调试程序时更加安全 和方便;即使是人们用STL在 ......
1.strlen()
实现:
size_t strlen(const char *s)
{
size_t n;
for(n = 0; *s != '\0'; s++)
++n;
return n;
......