cin.fail()在C ++中的含义?

时间:2013-07-28 09:52:18

标签: c++ cin

while (!correct)
    {   

        cout << "Please enter an angle value => ";
        cin >> value; //request user to input a value

        if(cin.fail()) // LINE 7
        {
            cin.clear(); // LINE 9
            while(cin.get() != '\n'); // LINE 10
            textcolor(WHITE);
            cout << "Please enter a valid value. "<< endl;
            correct = false;

        }
        else
        {
            cin.ignore(); // LINE 18
            correct =true;
        }
    }

嗨,这是我编写的代码的一部分。 此代码的目的是限制用户输入10,10.00等数字, 如果他们输入像(abc,!$ @等等)的值,代码将要求用户重新输入值。

为了执行此功能(限制用户输入有效价值),我会通过论坛获得一些提示和指南。

我认为我有责任学习并理解这些代码的作用......因为这是我第一次使用此代码。 有人可以简单地向我解释代码是什么 第7,9,10和18行呢? 尤其是第10行。我在第10行的其他部分得到了一个简短的想法我不知道它做了什么。

感谢您的导游,我很感激!

7 个答案:

答案 0 :(得分:2)

cin.fail()告诉您先前的输入操作中“某些内容是否失败”。我相信输入流有四种已识别的状态:badgoodeoffail(但failbad可以是例如,同时设置)。

cin.clear()将州重置为good

while(cin.get() != '\n') ;将一直读到当前输入行的结尾。

cin.ignore();将跳到下一个换行符,因此与while(cin.get() != '\n');非常相似。

如果没有给出正确的输入并且输入“已结束”(例如,CTRL-Z或CTRL-D取决于平台),整个代码也应该检查文件的结尾,否则它将挂起(永远循环失败) 。

答案 1 :(得分:1)

// LINE 7: cin.fail()检测输入的值是否符合变量中定义的值。

// LINE 18: cin在流中留下换行符。将cin.ignore()添加到下一行会清除/忽略流中的换行符。

答案 2 :(得分:0)

对于第7行和第9行,请阅读document

while(cin.get() != '\n'); // LINE 10

while中,它测试行cin.get()是否为空行,即仅包含新行。

答案 3 :(得分:0)

第7行:测试输入的数据是否正确(可以读作decltype(value))。如果流发生了一些错误,则cin.fail()始终为true。后来,在

第9行:您将cin状态从坏状态清除到之前的正常状态。 (错误后恢复)。在从糟糕状态恢复之前,您无法再读取数据。

第10行:你读到行尾。基本上你从输入中跳过一行

第18行:仅当输入的数据得到纠正时才会执行此行。它从stdin中读取并丢弃一行。

答案 4 :(得分:0)

标准输入流(cin)可能由于多种原因而失败。

例如,如果valueint,则用户输入大量数字 124812471571258125cin >> value将失败,因为该数字太大而无法容纳int

可是:

有一种更简单的方法可以做你想要的。您希望用户只输入有效的浮点值,例如10或10.00,但没有人物,对吗?所以你可以这样做:

double value;
cout << "Please enter an angle value: " << endl;
while (!(cin >> value)) { //Since value is a double, (cin >> value) will be true only if the user enters a valid value that can be put inside a double
  cout << "Please enter a valid value:" << endl;
}

这与您的代码的功能相同,但更简单。

如果您对其他因素导致cin失败感兴趣,请查看此处: http://www.cplusplus.com/forum/beginner/2957/

答案 5 :(得分:0)

while(cin.get()!='\ n'):c中的所有字符串都以空值终止。这意味着\ n是所有字符串对象的结尾。假设你有字符串“this”,因为这是\ n,每个字母都存储在char类型中。请继续阅读 http://www.functionx.com/cpp/Lesson16.htm

cin.fail():cin.fail()检测输入的值是否符合变量中定义的值。

读:http://www.cplusplus.com/forum/beginner/2957/

cin.ignore():从输入序列中提取字符并丢弃它们 http://www.cplusplus.com/reference/istream/istream/ignore/

答案 6 :(得分:0)

我知道Stack Overflow中通常只列出链接,所以我会给出更多细节,但这个答案实际上归结为一堆链接。

对于第7行,只需google cin.fail。 Here's一个很好的参考,以及它的内容:

  

如果为流设置了failbit或badbit错误状态标志中的任何一个(或两者),则返回true。

     

当在输入操作期间发生除了到达文件结尾之外的某些错误时,至少设置了其中一个标志。

     

failbit通常由错误与操作本身的内部逻辑相关的操作设置;可以对流进行进一步的操作。虽然badbit通常在错误涉及流的完整性丢失时设置,但即使在流上尝试不同的操作,也可能持续存在。可以通过调用成员函数bad来独立检查badbit:   一行翻译:它会告诉您在尝试读取输入流时是否出现意外错误。

您可以找到cin.ignorecin.clearcin.get的类似参考。快速摘要:

cin.ignore - 忽略流中存在的单个字符。 cin.clear - 清除流中的任何错误标记 cin.get - 一次获取一个字符,直到您点击换行符'\n'