C++ C++;istream操作员>&燃气轮机;错误的数据处理
每次我在这里问一个问题,结果都是一些非常愚蠢的错误(如果你不相信我,请检查我的历史记录),所以如果你能在这里,请容忍我 我觉得我的问题应该很受欢迎,但我找不到任何关于它的东西,我也没有办法尝试了 不管怎样,不用再麻烦了:C++ C++;istream操作员>&燃气轮机;错误的数据处理,c++,operator-overloading,C++,Operator Overloading,每次我在这里问一个问题,结果都是一些非常愚蠢的错误(如果你不相信我,请检查我的历史记录),所以如果你能在这里,请容忍我 我觉得我的问题应该很受欢迎,但我找不到任何关于它的东西,我也没有办法尝试了 不管怎样,不用再麻烦了: 我正在尝试重载输入运算符>>。它应该一次从文件中读取一个整数,跳过无效数据,例如chars、floats等 当然,我正在检查if(in>>inNum)以get()获取下一个令牌和检查是否成功获取() 如果成功了,没什么好说的。 但是,如果失败,我假设发生了两件事中的一件: 它
我正在尝试重载输入
运算符>>
。它应该一次从文件中读取一个整数,跳过无效数据,例如char
s、float
s等
当然,我正在检查if(in>>inNum)
以get()获取下一个令牌和检查是否成功获取()
如果成功了,没什么好说的。但是,如果失败,我假设发生了两件事中的一件:
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;
}
istream&operator>>(istream&in、SortSetArray&setB){
bool-eof=false;
int inNum=-1;
而(!eof){
如果(在>>inNum中){
cout>inNum
不知怎么也没能用上它。没什么大不了的,我就试试能用上的
在过去的两个小时里,我几乎就是这么做的。我尝试了istream::ignore()、istream::get()、ios::rdstate来检查eof、double
和string
而不是文件中的char
,以防char
被数字读取
什么都不管用,我绝望了
奇怪的是,上面的方法适用于以前的一个程序,在这个程序中,我必须读取格式为:string
int
int
int
唯一的区别是,我使用了一个
ifstream
对象作为该对象,使用了一个istream
对象作为该对象
额外的问题:当打嗝发生时inNum的值为0。我猜这是istream::operator>>所做的事情
实施说明
setB
std::istream
通过设置适当的错误标志来处理这些情况,但它不会丢弃任何数据
您的实现的问题是,在尝试读取无效数据时,您将再次尝试读取相同的无效数据
解决方案 清除错误标志后,您可以使用它丢弃流中的任何数据 函数的第一个参数是要忽略的潜在
char
s的最大数量,第二个参数是“如果你点击了这个char,不要再忽略了*
让我们忽略最大字符数,或者直到我们点击''
(空格):
#包括//标准::数值限制
in.ignore(std::numeric_limits::max(),“”);
使用in.clear();
清除导致该错误的任何错误标志,然后重试。编辑:同时添加cin.ignore(std::numeric_limits::max(),'\n');
删除卡在stream@Gasim我不知道你的意思。这是我在else{}体中做的第一件事。我还应该在哪里clear()
?@Kafeaulait您正确放置了clear()
调用。唯一要做的就是ignore()
违规字符。如果文件格式是您所说的格式(一行空格分隔的字符),那么您所要做的就是is.ignore();
忽略该单个字符。确保该字符位于调用clear()之后
@Gasim@0x499602D2有效。虽然我必须忽略,直到找到'
,而不是\n
,因为我的数据都在一行上。奇怪的是,当我一小时前尝试时,它没有忽略任何东西。这些标志可能以某种方式影响了忽略()
,而清除()
成功了。谢谢你说“我想,“你为什么不使用调试器?
#include <limits> // std::numeric_limits
in.ignore (std::numeric_limits<std::streamsize>::max(), ' ');