2014-01-20 84 views
0

每当我在这里提出一个问题时,结果都是一些非常愚蠢的错误(如果你不相信我,请查看我的历史记录),所以请耐心等待可以在这里。C++ istream操作符>>错误数据处理

感觉好像我的问题应该很受欢迎,但是我找不到任何关于它的事情,我已经用尽了想法尝试。

无论如何,事不宜迟:


我试着输入超载operator>>。它应该在同一时间从文件中读取一个整数跳过无效数据如char S,float S等

当然,我检查if(in >> inNum)的get()的下一个标记检查成功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被数字读取。

没有用,我很绝望。

古怪足够,该方法上述工作了以前的方案,我必须读出的数据的条目的三重行上的格式的:stringintint
唯一的区别是我使用的ifstream对象为那一个,和这个的一个istream对象。

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

+1

使用'in.clear();'清除任何错误标志导致它再次尝试编辑:还加上'CIN。忽略(STD :: numeric_limi ts :: max(),'\ n');'删除被卡在流中的字符 – Gasim

+0

@Gasim我不确定你的意思。这是我在else {}中做的第一件事情。我应该在哪里清除()'? – Kafeaulait

+0

对不起,阅读编辑 – Gasim

回答

1

实现描述

  1. 尝试读取一个int
  2. 如果成功;
    1. 读值插入到setB
    2. 下一个迭代
  3. 别人;
    1. 清除错误标志
    2. 检查,以便我们还没有达到文件
    3. 仍然更多的数据结束了吗? 下一次迭代

以上是你的函数的逻辑描述,但有若有所失......

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

与您的实现问题是,当试图读取无效数据时,您将只尝试再次读取相同的无效数据..一遍又一遍,一遍又一遍,inf


解决方案

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

功能的说法是潜在char s到忽略的最大数量,以及第二是“如果你打这个焦炭,不要忽略任何更多*。

让我们忽略字符的最高金额,或直到我们打' '(空间):

#include <limits> // std::numeric_limits 

in.ignore (std::numeric_limits<std::streamsize>::max(), ' '); 
相关问题