我想知道While(cin)测试是什么?

时间:2015-09-26 17:08:43

标签: c++

我正在读一本书,"软件 - 使用C ++的原则和实践"作者:Bjarne Stroustrup ,并提供了此代码:

Token get_token();
vector<Token>tok;

int main()
{
    while(cin)
    {
        Token t = get_token();
        tok.push_back(t);
    }
}

什么时候检查?

1 个答案:

答案 0 :(得分:4)

while将其条件表达式结果转换为bool。据此,在iostreams的情况下,它调用std::ios::operator bool

  

返回是否设置了错误标志(failbitbadbit)。

     

请注意,此函数与成员good不同,但与成员fail相反。

模型示例显示设置了哪些位以及何时:

#include <iostream>
#include <iomanip>

void foo(std::istream& in, std::ostream& out) {

    std::string str;
    out << "goodbit | eofbit | failbit | badbit | string" << std::endl;

    while(true) {
        in >> str;

        auto s = in.rdstate();

        out
                << std::setw(7) << bool(s & std::ios::goodbit) << " | "
                << std::setw(6) << bool(s & std::ios::eofbit)  << " | "
                << std::setw(7) << bool(s & std::ios::failbit) << " | "
                << std::setw(6) << bool(s & std::ios::badbit)  << " | ";

        if(in) {
                out << str << std::endl;
        }
        else {
            out << std::endl;
            break;
        }
    }

}

int main(void) {

    foo(std::cin, std::cout);

    return 0;
}

$ echo "a ab" | ./untitled(输入管道)打印

goodbit | eofbit | failbit | badbit | string
      0 |      0 |       0 |      0 | a
      0 |      0 |       0 |      0 | ab
      0 |      1 |       1 |      0 |