gpt4 book ai didi

C++ istream operator>> 坏数据处理

转载 作者:行者123 更新时间:2023-11-28 07:09:32 26 4
gpt4 key购买 nike

每次我在这里问一个关于 SO 的问题,结果都是一些非常愚蠢的错误(如果你不相信我,请检查我的历史),所以如果可以的话请多多包涵。

感觉我的问题应该很受欢迎,但是我找不到任何关于它的东西,我已经没有想法可以尝试了。

总之,事不宜迟:


我正在尝试使输入过载 operator>> .它应该一次从文件中读取一个整数跳过无效数据,例如char小号,float s等

当然,我正在检查 if(in >> inNum) get() the next tokencheck for successful get()
成功了就不多说了。
但是,如果它失败了,我假设发生了以下两种情况之一:

  1. 它偶然发现了一个非整数
  2. 它到达了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,doublestring而不是 char在文件中,以防万一 char以数字方式读取。

没有任何效果,我很绝望。

奇怪的是,上面的方法适用于以前的程序,在该程序中,我必须读取格式为一行的三元组数据条目:string int int
唯一的区别是我使用了 ifstream那个对象,和一个istream这个对象。

奖金问题:当打嗝发生时,inNum 的值为 0。我猜这是 istream::operator>> 做的事情?

最佳答案

Implementation description

  1. try to read an int
  2. if successful;
    1. insert the read value to setB
    2. next iteration
  3. else;
    1. clear error flags
    2. check so that we haven't reached the end of the file
    3. still more data? next iteration.

上面是你的函数的逻辑描述,但是少了点什么……

如果我们尝试读取一个值但失败了,std::istream 会通过设置适当的错误标志来处理这些情况,但它不会丢弃任何数据。

您的实现的问题在于,在尝试读取无效数据时,您将再次尝试读取相同的无效数据。一遍又一遍,inf


解决方案

清除错误标志后,您可以使用 std::istream::ignore丢弃流中的任何数据。

函数的第一个参数是要忽略的潜在char的最大数量,第二个是“如果你点击这个< em>char,不要再无视了*。

让我们忽略最大字符数,或者直到我们点击 ' '(空格):

#include <limits> // std::numeric_limits

in.ignore (std::numeric_limits<std::streamsize>::max(), ' ');

关于C++ istream operator>> 坏数据处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21225782/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com