проверка ввода шаблона c ++ - PullRequest
0 голосов
/ 18 октября 2011

Я использую следующее для простого извлечения ввода и проверки правильности типа. Однако конец файла 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 Ответ

1 голос
/ 18 октября 2011

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...