c ++模板输入验证

时间:2011-10-17 22:51:59

标签: c++ validation templates input

我正在使用以下内容轻松提取输入并验证正确的类型。但是,文件EOF的结尾没有被触发。

template< typename T >
std::istream& read(std::istream &istr, T &val)
{
    std::string s;
    std::getline(istr, s);

    if (istr.good())
    {
        s.erase(s.find_last_not_of(" \n") + 1);

        std::stringstream iss(s);

        iss >> val;

        if (! iss.good())
            istr.setstate(std::ios::failbit);

        char c;
        if (iss.get(c))
            istr.setstate(std::ios::failbit);
    }

    return istr;
}
int main(int argc, char **argv)
{
    int input = 0;

    std::cout << "Please enter an integer>" << std::flush;

    for (;;)
    {
        if (read(std::cin, input))
            break;

        std::cin.clear();
        std::cout << "Please, enter only an INTEGER>" << std::flush;
    }

    std::cout << "Press <enter> to quit>";
    std::cin.ignore(std::numeric_limits< std::streamsize >::max(), '\n');
    return 0;
}

“111”输入时不会验证为整数。

1 个答案:

答案 0 :(得分:1)

iss >> val读取所有字符并“触摸”流的结尾,因此每次都会启动EOF。

template< typename T >
std::istream& read(std::istream &istr, T &val)
{
    std::string s;
    std::getline(istr, s);

    if (istr.good()) {
        std::istringstream iss(s); //leave the '\n'

        if (! (iss >> val))
            istr.setstate(std::ios::failbit);

        //if it gets another character that isn't a newline
        char a=0;
        if (iss.get(a) && a!='\n') 
            istr.setstate(std::ios::failbit);
    }

    return istr;
}