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