从文件读入数据块时用feof(fp)判断文件结尾真的保险吗?
2011-12-22 22:29
316 查看
今天用文件输入时发现了一个值得注意的问题。
先看程序:
再看文件1.txt中的内容:
1 2
3 4
5 6
你也许会认为输出的结果会是:
1 2
3 4
5 6
你有可能发现结果会是:
1 2
3 4
5 6
5 6
怎么最后一对数据出现两次?
因为程序从文件输入时一共输入了4次 比计划的3次多了一次。你打开文件1.txt检查发现数据只有3行
1 2
3 4
5 6
其实5 6的最后面还加了一个回车,回车是看不到的。
当程序从文件读入5 6后,文件还有一个回车符,所以这时文件还没结束。!feof(in)的值为真。所以接着从文件输入,
而文件指针此时指向的文件位置处没有两个int数据,所以输入失败 a和b还保存这上一次输入的值。就会出现上面看到的结果。
其实,只要利用fscanf()自身的返回值判断就没有问题。
程序改为如下:
这时输出结果就入我们所料了。
这时我写邻接表时犯的错误,找了好久才找到!
先看程序:
#include <stdlib.h> #include <stdio.h> int main(void) { FILE*in=fopen("1.txt","r"); int a,b; if(in==NULL) { printf("error:cannot open infile !\n"); return -1; } while(!feof(in)){ fscanf(in,"%d %d",&a,&b); printf("%d %d\n",a,b); } system("pause"); return 0; }
再看文件1.txt中的内容:
1 2
3 4
5 6
你也许会认为输出的结果会是:
1 2
3 4
5 6
你有可能发现结果会是:
1 2
3 4
5 6
5 6
怎么最后一对数据出现两次?
因为程序从文件输入时一共输入了4次 比计划的3次多了一次。你打开文件1.txt检查发现数据只有3行
1 2
3 4
5 6
其实5 6的最后面还加了一个回车,回车是看不到的。
当程序从文件读入5 6后,文件还有一个回车符,所以这时文件还没结束。!feof(in)的值为真。所以接着从文件输入,
而文件指针此时指向的文件位置处没有两个int数据,所以输入失败 a和b还保存这上一次输入的值。就会出现上面看到的结果。
其实,只要利用fscanf()自身的返回值判断就没有问题。
程序改为如下:
#include <stdlib.h> #include <stdio.h> int main(void) { FILE*in=fopen("1.txt","r"); int a,b; if(in==NULL) { printf("error:cannot open infile !\n"); return -1; } while(fscanf(in,"%d %d",&a,&b)==2){ printf("%d %d\n",a,b); } system("pause"); return 0; }
这时输出结果就入我们所料了。
这时我写邻接表时犯的错误,找了好久才找到!
相关文章推荐
- 判断读入数据文件结尾【从文件读入数据】
- 文件结尾判断feof , EOF
- feof()和EOF的用法—— C中文件结尾的判断
- C语言-EOF和feof()判断文件结尾的区别
- feof()和EOF的用法—— C中文件结尾的判断
- feof()和EOF的用法—— C中文件结尾的判断
- feof()和EOF的用法—— C中文件结尾的判断
- feof()和EOF的用法—— C中文件结尾的判断
- feof()和EOF的用法—— C中文件结尾的判断
- feof()和EOF的用法—— C语言中文件结尾的判断 (个人感觉写的挺深刻)
- feof()和EOF的用法—— C中文件结尾的判断
- 关于C语言feof()函数判断文件结尾的问题分析
- feof()和EOF的用法—— C中文件结尾的判断
- 文件操作函数feof判断是否指向文件的结尾处,结尾即为空字符
- feof()和EOF的用法—— C中文件结尾的判断
- feof()和EOF的用法—— C中文件结尾的判断
- fgets与feof 判断文件结尾
- feof()和EOF的用法—— C中文件结尾的判断
- 判断文件结尾的方法(feof函数和EOF)
- 判断文件结束有两种方法:EOF和feof()