我有一个文本文件如下:
1 A Rocket-1 1.2
2 B Rocket-2 2.3
3 C Rocket-3 3.4
Invalid Format Line
4 D Rocket-4 4.5
5 E Rocket-5 5.6如您所见,所采用的格式是:<int> <char> <string literal> <float>
我想从每一行中提取各个数据类型并打印出来。我做了这个:
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
using namespace std;
int main() {
ifstream in;
in.open("input.txt");
if (in) {
while (getline(in, x)) {
istringstream iss(x);
iss >> i >> c >> s >> f;
cout << "\n\nInteger:" << i << ", Character: " << c << ", String: "
<< s << ", Float: " << f << endl << endl;
}
}
else {
cout << "\nError reading input file\n";
}
cin.get();
return 0;
}产出如下:
Integer:1, Character: A, String: Rocket-1, Float: 1.2
Integer:2, Character: B, String: Rocket-2, Float: 2.3
Integer:3, Character: C, String: Rocket-3, Float: 3.4
Integer:3, Character: C, String: Rocket-3, Float: 3.4
Integer:4, Character: D, String: Rocket-4, Float: 4.5
Integer:5, Character: E, String: Rocket-5, Float: 5.6如您所见,其中一行(第3行)正在重复。当我有一个无效格式的行时,我只想忽略它,并且平稳地(不崩溃)转换到下一个有效的格式行。请建议修改我的代码来处理这个问题。
发布于 2015-04-07 21:03:41
您可以测试流插入的结果。如果格式不正确,它将处于无效状态:
if(!(iss >> i >> c >> s >> f)) // skip the loop if not correct format
continue; 发布于 2015-04-07 21:04:10
您所面临的问题是由于无效的字符串被放置在您的区域流中,然后尝试根据有效的格式进行提取。当然,这是失败的,因此变量i、c、s和f保留了它们的原始值。如果您想忽略无效的行,您应该查询istringstream的失败位。与…有关的东西
if ( iss.fail() ) {
continue;
}应该能起作用。来自gtgt
如果提取失败(例如,在需要数字的地方输入一个字母),则值将保持不变,并设置故障位。
发布于 2015-04-07 21:07:28
提取后,可以检查ios_base::iostate是否为eofbit、故障位或坏位。请参阅http://www.dcs.uni-pannon.hu/smidla/web/cplusplus/reference/iostream/istream/operator%3E%3E/index.html
https://stackoverflow.com/questions/29501163
复制相似问题