c++读取文件eof的疑惑
来源:互联网 发布:网络电视剧排行榜 编辑:程序博客网 时间:2024/05/17 23:54
原文地址:http://blog.chinaunix.net/uid-27034868-id-3758629.html
对于文本文件,当我们使用eof()判断文件是否结束时会多读一次(c语言也有类似的情况),或许你有遇到过这种情况。
先看下面的例子吧:
点击(此处)折叠或打开
- #include<iostream>
- #include <string>
- #include<fstream>
- #include<cstdlib>
- using namespace std;
- int main()
- {
- char data;
- ifstream infile;
- infile.open("in.txt");
- if(infile.fail())
- {
- cout<<"Fail to open the input file"<<endl;
- exit(1);
- }
- while(!infile.eof())
- {
- infile >> data;
- cout << data;
- }
- infile.close();
- cout << endl;
- return 0;
- }
假设输入文件in.txt的内容为:
abc
则输出结果是:abcc
明明使用了eof()判断了,为什么还是这样的呢?原因是这样的,因为eof()发现读到文件结束标志EOF(即-1)时并不会立刻返回true,
而是比较后知后觉。此时需要再读一下,这时eofbit才被设置(并且设置其他的bit,如goodbit),等下次调用eof()时才返回true。 C++ Standard Library中Constants for the Stateof Streams有一个表如下:
既然知道问题所在,问题就好解决了。
方法一:
while( !infile.eof() )
{
infile >> data;
if( infile.good()
{
cout << data ;
}
}
或者:
while( !infile.eof() )
{
infile >> data;
if (infile.fail())
{
break;
}
cout << data ;
}
方法二:
while(infile >> data)
{
cout << data ;
}
方法三:使用peek函数
while(infile.peek()!=EOF)
{
infile >> data; //用>>读取时会忽略(跳过)空格等空字符,使用infile.get(data)不会
cout << data ;
}
peek()只是查看缓冲的下一个元素,并不读取(即文件内部指针不会向后移动),c++ Standard Library中有一句描述:
Returns the next character to be read from the stream without extracting it.
可以看出peek有一个局限,只能在读取char类型时使用。
例如,in.txt内容为以空格隔开的字符串,因为我们在程序中写入文件时,每写入一个字符串之后跟一个空格,所以最后一个字符串之后有空格:
string str;
while(infile.peek()!=EOF)
{
infile >> str;
cout << str << endl;
}
同样会多读一次, 不信可以试试看,呵呵。至于如何解决,我想你应该能够举一反三了吧。
- c++读取文件eof的疑惑
- C++和C读取WAV文件头的疑惑
- 关于文件读取的eof问题
- C/C++文件的一些疑惑
- C++文件读取末尾 eof()
- C语言的EOF
- C/C++文件之eof()
- C/C++文件之eof()
- C/C++文件之eof()
- C/C++文件之eof()
- Linux C下的EOF文件结束符
- 文件复制的疑惑
- 文件读取信息,eof()多读问题
- 文件流读取之EOF与Peek
- 关于java 读取propterties 文件的疑惑 和问题的解决
- C语言EOF的用法
- 关于C语言的EOF
- 【C++】EOF表示的是什么意思
- 程序员必读:一个码农在硅谷的悲惨故事
- Spring注解@Component、@Repository、@Service、@Controller区别
- 知识点小结
- [转]yii2 常用数据库操作
- JavaScript强化教程——AngularJS
- c++读取文件eof的疑惑
- RHCE7 认证学习笔记
- android 不同的权限登录显示不同的功能界面 简单实现
- PostMessage(异步)和SendMessage(同步)的区别
- 汽水瓶
- 最长回文子串
- tjut 3498
- 部署微信时,不能访问,显示找不到资源页
- 散列表 哈希表 原理 python实现