C++模板输入验证

标签 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”在应该验证为整数时未验证为整数。

最佳答案

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

关于C++模板输入验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7800548/

相关文章:

c++ - Arduino代码中的继承

c++ - 如何在 boost::unordered_map 中实现 TryGetValue?

templates - 何时在 JSF 2.2 中使用资源库契约?

validation - 迁移表中存在 :true vs. null:false

ajax - CJuiDatePicker 验证消息不起作用

c++ - 有没有办法专门针对目标原语模板?

C++ 模板 std::tuple 到 void* 并返回

c++ - 检查变量参数的类型

C++创建进程时指定进程id

c# - Silverlight DataGrid 验证显示所有对象的验证错误|属性