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