Ifstream.getline() - 只读第一行?

时间:2015-02-17 17:47:26

标签: c++ iostream

我只是想运行一个简单的c ++程序,它将使用数据条目格式化.txt文件。我已经使用完全相同格式的许多不同文本文件运行它,现在它将无法正常工作。我确信解决方案很简单。

以下是该程序的简化版本(我将所有内容修剪为仅显示给我带来麻烦的部分)。

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <iomanip>

using namespace std;

int main(){

    ifstream filei("in.txt");
    ofstream fileo("comlab.txt");
    double a, b;
    string s;
    stringstream ss;

    while (getline(filei,s)){
        ss<<s;
        ss>>a>>b;
        fileo<<setw(10)<<a<<setw(10)<<b<<'\n';
    }

    fileo.close();
}

以下是in.txt的示例输入:

1        11
2        22
3        33
4        44
5        55

现在我想要显示的内容(与输入完全相同):

1        11
2        22
3        33
4        44
5        55

但这是实际显示的内容:

         1        11
         1        11
         1        11
         1        11
         1        11

发生了什么事?我正在用g ++编译并遵循C ++ 11标准。

1 个答案:

答案 0 :(得分:3)

执行时

    ss>>a>>b;

在第一轮循环执行中。 ss已经在流的末尾。即ss.eof() == true。您需要清除其状态并重置状态以从头开始阅读。

while (getline(filei,s)){
    ss<<s;
    ss>>a>>b;
    ss.clear();
    ss.seakg(0);
    fileo<<setw(10)<<a<<setw(10)<<b<<'\n';
}

更好的选择是在循环范围内创建对象。

while (getline(filei,s)){
    stringstream ss;
    ss<<s;
    ss>>a>>b;
    fileo<<setw(10)<<a<<setw(10)<<b<<'\n';
}

甚至更简单(感谢@vsoftco的建议)

while (getline(filei,s)){
    stringstream ss(s);
    ss>>a>>b;
    fileo<<setw(10)<<a<<setw(10)<<b<<'\n';
}