最后一个空行和ifstream :: operator>> (C ++)

时间:2013-10-28 13:48:11

标签: c++ operator-keyword ifstream

我对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相关的问题还是类似的问题? 我使用Microsoft VC ++ 2010。

提前致谢。

2 个答案:

答案 0 :(得分:3)

使用stream.eof()进行循环控制我们通常会出错:始终想要在读取后检查结果

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

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

答案 1 :(得分: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;
}