2

我对以下代码中的 ifstream::operator>> 行为有疑问:

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

int main () {
    ifstream inFile("test.txt");
    string buffer;
    while (!inFile.eof()) {
        inFile >> buffer;
        cout << buffer << endl;
    }
    return 0;
}

如果 test.txt 的最后一行不为空,则此代码运行良好,例如:

One two
Three four
Five six

但是,如果 test.txt 是这样写的:

One two
Three four
Five six
(empty line)

cout显示两个“六个”字符串。这是与 Windows 的 \r\n 或类似的问题有关的问题吗?我使用微软 VC++ 2010。

提前致谢。

4

2 回答 2

3

使用stream.eof()for 循环控制我们通常是错误的:你总是想在阅读后检查结果:

while (inFile >> buffer) {
    ...
}

格式化读取将从跳过前导空格开始。之后,字符串提取器将读取非空白字符。如果没有这样的字符,则提取失败并且流转换为false.

于 2013-10-28T14:34:58.773 回答
0

在阅读之前它还不是EOF。但由于 EOF 到达,最后一次读取操作失败。

您可以使用fail检查您上次读取是否失败:

int main () {
    ifstream inFile("test.txt");
    string buffer;
    while (!inFile.eof()) {
        inFile >> buffer;
       /**EDIT**/
       if(!inFile.fail()){
            cout << buffer << endl;
        }else{
            cout << endl;
        }
    }
    return 0;
}
于 2013-10-28T14:02:06.233 回答