我正在使用以下内容轻松提取输入并验证正确的类型。但是,文件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”输入时不会验证为整数。
答案 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;
}