每当我在这里提出一个问题时,结果都是一些非常愚蠢的错误(如果你不相信我,请查看我的历史记录),所以请耐心等待可以在这里。C++ istream操作符>>错误数据处理
感觉好像我的问题应该很受欢迎,但是我找不到任何关于它的事情,我已经用尽了想法尝试。
无论如何,事不宜迟:
我试着输入超载operator>>
。它应该在同一时间从文件中读取一个整数,跳过无效数据如char
S,float
S等
当然,我检查if(in >> inNum)
既的get()的下一个标记和检查成功get()。
如果成功,那里就不多说了。
如果它失败了,但是,我认为一两件事情发生了:
- 它偶然发现了一个非整数
- 它到达EOF
以下是我试图解决它:
istream& operator>> (istream& in, SortSetArray& setB) {
bool eof = false;
int inNum = -1;
while(!eof) {
if(in >> inNum) {
cout << "DEBUG SUCCESS: inNum = " << inNum << endl;
setB.insert(inNum);
}
else {
// check eof, using peek()
// 1. clear all flags since peek() returns eof regardless of what
// flag is raised, even if it's not `eof`
in.clear();
cout << "DEBUG FAIL: inNum = " << inNum << endl;
// 2. then check eof with peek()
eof = (in.peek() == std::char_traits<char>::eof());
}
}
return in;
}
该文件包含[1 2 3 4 a 5 6 7],程序自然进入无限循环。 好吧,很容易猜到,peek()不消耗字符'a',也许in >> inNum
也未能以某种方式消耗它。没什么大不了的,我只会尝试一下。
这就是我在过去的2个小时里所呆过的地方。我尝试了istream :: ignore(),istream :: get(),ios :: rdstate来检查文件中的eof,double
和string
而不是char
,以防char
被数字读取。
没有用,我很绝望。
古怪足够,该方法上述工作了以前的方案,我必须读出的数据的条目的三重行上的格式的:string
int
int
唯一的区别是我使用的ifstream
对象为那一个,和这个的一个istream
对象。
红利问题:当打嗝发生时,inNum的值为0。我猜这是istream :: operator >>所做的事情?
使用'in.clear();'清除任何错误标志导致它再次尝试编辑:还加上'CIN。忽略(STD :: numeric_limi ts :: max(),'\ n');'删除被卡在流中的字符 –
Gasim
@Gasim我不确定你的意思。这是我在else {}中做的第一件事情。我应该在哪里清除()'? – Kafeaulait
对不起,阅读编辑 – Gasim