void main() { PNode pNode; FILE *fp=fopen("1.txt","r"); pNode=Create(i); while(getc(fp)!=EOF) { int i; fscanf(fp,"%d",&i); pNode=Add(i,pNode); } fclose(fp); Print(pNode); }
(问题源码如上所示)
编程
我在温习C语言时,准备尝试编写单链表的结构,可是写到上面一段代码,运行后发现,文件的最后一个字符被重复读取了,焦头烂脑思考了一下子,而且尝试搜集资料,写了这个博客。数据结构
这个问题根源在文件读取上,由于我尝试了直接向链表中添加数据是没有任何问题的。而本程序使用了两个文件读取函数,即getc和fscanf,这两个函数的交错使用在必定程度上是程序结构有点混乱,这多是我当时编程的时候没有用心思考形成的。函数
若是文件自身没有设置EOF的话,咱们的getc函数遇到'\0'以后,将设置为EOF,再进入循环体一次,而fscanf已经读取不到有效字符了,所以返回EOF,可是此时i的值仍为最后一个整数的值,所以将再次读取该值。若是将下面一句spa
getc(fp)!=EOF
改成!feof(fp),则问题仍会出现,缘由同上。code
正确的作法应该是下面一段代码:
get
PNode pNode; //从文件中读取数据并添加到链表中 FILE *fp=fopen("1.txt","r"); int count=0; int i; pNode=Create(); while(fscanf(fp,"%d",&i)!=-1) { pNode=Add(i,pNode); } fclose(fp); Print(pNode);
这样的话,重复读取字符的问题就不会出现了。由于此时会直接判断是不是有效字符,若不是,直接退出while循环,所以最后一个字符只会被读取一次。源码
用C语言实现数据结构确实可以学到不少东西,越是底层的语言,越能锻炼个人代码能力。本次尝试本身彻底独立编写单链表的基本操做,基本上能够实现感谢C语言,感谢计算机!
博客