代码之家  ›  专栏  ›  技术社区  ›  user3512999

故障后的istream读数

  •  0
  • user3512999  · 技术社区  · 8 年前

    我有一小段代码来读取用户数据,如下所示:

    #include<iostream>
    #include<vector>
    #include<algorithm>
    #include<ios>
    #include<iomanip>
    #include<string>
    
    using namespace std;
    
    istream& read_dt(istream& in, vector<int>& nmbr) {
    if(in) {
     nmbr.clear();
    
     int x;
      while(in >> x) {
       nmbr.push_back(x);
      }
      if(in.fail()) {
       string s;
       in >> s;
       in.clear();
      }
     }
     return in;
    }
    
    int main() {
     vector<int> data;
     cout << "Enter all the data: " << endl;
     read_dt(cin, data);
     cout << "Size: " << data.size() << endl;
    }
    

    当我使用以下数据编译和执行上述程序时: 1 2 3 4第5 6 7页

    我似乎得到了一个大小为4而不是7的向量。我在上面实现的是,当用户将无效输入作为数据(在本例中为“r”和“t”)时,该数据被丢弃,输入被清除(使用in.clear()),其余输入被“推”到向量数据中。

    但这似乎并没有发生。我做错了什么?有人能帮忙吗?

    谢谢

    1 回复  |  直到 8 年前
        1
  •  5
  •   Jerry Coffin    8 年前

    一旦流发生故障,该流将保持故障状态( 读取可以成功),直到您清除()流。

    现在,您正在尝试在清除流之前从流中读取坏数据,这样读取永远不会成功。此外,在清除了坏数据之后,您没有提供任何方法继续从流中读取数据——您执行while循环,然后当它退出时,您从流中清除坏数据(如果有),然后返回您读取的内容。

    对于这样的情况,您将非常需要在流上独立于eof()进行测试,并继续读取,直到到达eof(。

    考虑到您试图在下一个空白处之前忽略错误数据,我将使用 ignore 而不是将数据读入字符串。将您不关心的数据读入字符串中没有实际意义。

    #include<iostream>
    #include<vector>
    #include<algorithm>
    #include<ios>
    #include<iomanip>
    
    using namespace std;
    
    istream& read_dt(istream& in, vector<int>& nmbr) {
        if (in) {
            nmbr.clear();
    
            int x;
            for(;;) { 
                in >> x;
    
                if (in.eof())
                    break;
    
                if (in.fail()) {
                    in.clear();
                    in.ignore(100, ' ');
                }
                else
                    nmbr.push_back(x);
            } 
            return in;
        }
    }
    
    int main() {
        vector<int> data;
        cout << "Enter all the data: " << endl;
        read_dt(cin, data);
        cout << "Size: " << data.size() << endl;
    }
    
    推荐文章