【发布时间】:2014-01-20 03:29:03
【问题描述】:
每次我在 SO 上提出问题时,结果都是一些非常愚蠢的错误(如果你不相信我,请查看我的历史记录),所以如果可以的话,请耐心等待。
感觉我的问题应该很受欢迎,但我找不到任何关于它的信息,而且我已经没有想法可以尝试了。
不管怎样,事不宜迟:
我正在尝试使输入 operator>> 过载。它应该从文件中一次读取一个整数,跳过无效数据,例如chars、floats 等。
当然,我正在检查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。
没有任何效果,我很绝望。
奇怪的是,上面的方法适用于之前的程序,我必须读取格式为一行的三组数据条目:stringintint
唯一的区别是我使用ifstream 对象作为那个对象,而istream 对象作为这个对象。
额外问题:当打嗝发生时,inNum 的值为 0。我猜这是 istream::operator>> 所做的事情?
【问题讨论】:
-
使用
in.clear();清除任何导致它的错误标志并重试。编辑:还添加cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');以删除卡在流中的字符 -
@Gasim 我不确定你的意思。这是我在 else{} 正文中做的第一件事。我还应该在哪里
clear()? -
@Kafeaulait 您正确放置了
clear()调用。剩下要做的就是ignore()冒犯的角色。如果文件格式是你所说的(一行空格分隔的字符),你所要做的就是is.ignore();忽略那个单个字符。确保这在调用clear()之后进行。 -
@Gasim @0x499602D2 那行得通。虽然我不得不忽略直到找到
' '而不是\n,因为我的数据都在一行上。很奇怪,当我在一小时前尝试时,它并没有忽略任何东西。这些标志可能以某种方式影响了ignore(),而clear()成功了。谢谢大家。 -
您说“我假设”,您为什么不使用调试器逐步完成?