c++模板输入验证

c++ template input validation

本文关键字:验证 输入 c++      更新时间:2023-10-16

为了方便地提取输入并验证正确的类型,我使用了以下代码。但是,没有触发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;
}

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;
}