【问题标题】:Using cin >> to error handle使用 cin >> 进行错误处理
【发布时间】:2011-09-18 11:36:45
【问题描述】:

我在阅读中遇到了这个......

while(!(std::cin >> array[i])) 
{
std::cin.clear(); 
while(std::cin.get()!= '\n') 
continue; 
std::cout << "enter a new input: ";
}

而且,我真的不明白错误处理是如何工作的。使用了std::cin.clear(),但代码继续从下一行的 cin 对象中获取字符,然后使用 continue 语句。如果它不能清除 cin,clear 究竟做了什么?谢谢你。

【问题讨论】:

    标签: c++ iostream cin


    【解决方案1】:

    .clear() 清除 cin 中的错误标志。例如,如果输入无法转换,它们就会被设置。当设置了任何错误标志时,从cin 提取输入将静默失败。

    【讨论】:

      【解决方案2】:

      cin.clear() 的作用是清除 cin 流的错误标志。当它这样做时,cin 流操作可以继续。下一行从流中提取一个字符并返回它。 要了解循环确实考虑以下情况:

      假设数组是 int 类型的,你输入:abc 然后回车。 cin 标识字符串输入不能进入 int 数组。因此它返回 false 并设置错误标志。当您执行 cin.clear() 时,它会重置错误标志,以便进一步的操作可以继续(cin.get() 可以工作)。现在 cin.get() 从溪流。因为它不等于 '\n' 循环继续(第二个循环),直到它提取 '\n' => 这意味着你刚刚输入的错误 i/p 都被冲走了你可以重新开始

      【讨论】:

      • 作为替代方案,您可以在 cin.clear 之后使用 cin.ignore(val,'\n') 且 val 足够高以刷新 i/p 流
      【解决方案3】:

      clear 函数为错误控制状态设置一个新值。

      考虑以下示例:

      // clearing errors
      #include <iostream>
      #include <fstream>
      using namespace std;
      
      int main () {
        char buffer [80];
        fstream myfile;
      
        myfile.open ("test.txt",fstream::in);
      
        myfile << "test";
        if (myfile.fail())
        {
          cout << "Error writing to test.txt\n";
          myfile.clear();
        }
      
        myfile.getline (buffer,80);
        cout << buffer << " successfully read from file.\n";
      
        return 0;
      }
      

      在上面的例子中,myfile 是为输入操作打开的,但只对其进行了输出操作,所以设置了failbit。然后该示例调用 clear 以删除标志并允许在 myfile 上成功执行 getline 等进一步操作。

      参考:ios::clear

      【讨论】:

        【解决方案4】:
        while(!(std::cin >> array[i])) 
        {
        std::cin.clear();             //clears any error flags on cin so get() works
        while(std::cin.get()!= '\n')  //in case white space is in the stream
        {                             //loop until the end of line character
           continue;              
        }
        std::cout << "enter a new input: ";
        }
        

        cmets 中的信息。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-02-17
          • 2021-05-28
          • 1970-01-01
          • 1970-01-01
          • 2015-09-04
          • 2021-01-27
          • 2011-06-04
          • 2018-05-04
          相关资源
          最近更新 更多