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

Ifstream.getline() - Only reading first line?

我只是想 运行 一个简单的 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 标准。

当你执行

    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';
}