Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;istream操作员>&燃气轮机;错误的数据处理_C++_Operator Overloading - Fatal编程技术网

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()获取下一个令牌检查是否成功获取() 如果成功了,没什么好说的。
但是,如果失败,我假设发生了两件事中的一件:

  • 它偶然发现了一个非整数
  • 它到达了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;
    }
    
    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>>所做的事情

    实施说明

  • 尝试读取一个int
  • 如果成功;
  • 将读取值插入到
    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(), ' ');