使用ifstream的get()函数读取文件中的字符发生错误

ifstream fin("input.txt");
while(!fin.eof()){
char c
fin.get(c)
cout<<c<<endl;
}
为什么读到文件末尾总是会多读一个与最后一个字符相同的字符?

真正原因是:在eof()这里。当文件指针到达文件末尾时,执行eof不会立刻返回true,要等到下一次读取时才会返回。即再执行一次get()之后,eof才会返回true。此时,ifstream流的状态标识为失败,get没有读到东西,所以c保存了上一次读取的数据,因此出现最后一个字符被显示两次的现象。

解决:修改代码,使用eof()与fail()结合判断文件结尾。
ifstream fin("input.txt");
while(!fin.eof()){
char c;
fin.get(c);
if(fin.fail()) break;//假如是文件尾部,在c输出之前就跳出

cout<<c<<endl;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-11-29
条件问题,你的while条件导致了没有从文件读入,但是还是输出了最后一个字符。
第2个回答  2015-06-27
C++ 通过以下几个类支持文件的输入输出:
ofstream: 写操作(输出)的文件类 (由ostream引申而来)
ifstream: 读操作(输入)的文件类(由istream引申而来)
fstream: 可同时读写操作的文件类 (由iostream引申而来)

打开文件(Open a file)
对这些类的一个对象所做的第一个操作通常就是将它和一个真正的文件联系起来,也就是说打开一个文件。被打开的文件在程序中由一个流对象(stream object)来表示 (这些类的一个实例) ,而对这个流对象所做的任何输入输出操作实际就是对该文件所做的操作。
要通过一个流对象打开一个文件,我们使用它的成员函数open():
void open (const char * filename, openmode mode);
这里filename 是一个字符串,代表要打开的文件名,mode 是以下标志符的一个组合:
ios::in 为输入(读)而打开文件
ios::out 为输出(写)而打开文件
ios::ate 初始位置:文件尾
ios::app 所有输出附加在文件末尾
ios::trunc 如果文件已存在则先删除该文件
ios::binary 二进制方式
这些标识符可以被组合使用,中间以”或”操作符(|)间隔。例如,如果我们想要以二进制方式打开文件"example.bin" 来写入一些数据,我们可以通过以下方式调用成员函数open()来实现:
ofstream file;
file.open ("example.bin", ios::out | ios::app | ios::binary);
ofstream, ifstream 和 fstream所有这些类的成员函数open 都包含了一个默认打开文件的方式,这三个类的默认方式各不相同:


参数的默认方式

ofstream ios::out | ios::trunc
ifstream ios::in
fstream ios::in | ios::out
只有当函数被调用时没有声明方式参数的情况下,默认值才会被采用。如果函数被调用时声明了任何参数,默认值将被完全改写,而不会与调用参数组合。
第3个回答  2010-11-27
没有错呀,我这里运行正确,你是不是文件写错了?本回答被网友采纳
相似回答