重新使用stringstream对象的问题

我试图使用安全的做法来处理与数字只在C + +的input,所以我使用一个stringstream对象,如下所示:

#include <iostream> #include <string> #include <sstream> using namespace std; int main() { int first, second; string input; stringstream sstream; cout << "First integer: "; getline(cin, input); sstream.str(input); sstream >> first; cout << first << endl; //display user input in integers cout << "Second integer: "; getline(cin, input); sstream.str(input); sstream >> second; cout << second << endl; //display user input in integers getline(cin, input); //pause program return 0; } 

但是,第二次似乎给variables“第二”一个任意值。 这是输出:

 First integer: 1 1 Second integer: 2 2293592 

如果我声明两个stringstream对象,并将它们分别用于两个variables,它似乎工作正常。 这是否意味着我不能以我想要的方式重新使用stringstream对象? 在我真正的程序中,我打算处理来自用户的两个以上的input值,所以我只想确定是否有另一种方法,而不是制作多个stringstream对象。 我怀疑它有很大的相关性,但我在Windows XP上,而且我使用MinGW作为我的编译器。

我非常感谢任何帮助。

Solutions Collecting From Web of "重新使用stringstream对象的问题"

使用sstream.clear(); 之后sstream >> first;

您需要重置stringstream的状态。 一般来说,这包括两个步骤:清除缓冲区:

 sstream.str(""); 

并重置错误状态标志:

 sstream.clear(); 

如果你没有清除缓冲区,如果你得到一个像“123abc”的输入,那么当你下次尝试读取它时,“abc”仍然在流中。

您还应该确保测试流( sstream.fail() )的失败状态,以确保提取成功。 如果你想确保用户只输入一个整数(即,你想防止用户输入“123abc”,那么你应该测试,以确保sstream.eof()是真实的。

在数据类型之间进行这种转换的更好方法是使用boost::lexical_cast

信息和例子可以在Boost站点找到。

下面是一个对字符串进行整型转换的例子,并返回(string to int),比如你在程序中做什么。

 #include <string> #include <boost/lexcal_cast.hpp> int main(int argc, char *argv[]) { int i = 42; std::string s = boost::lexical_cast<std::string>(i); int j = boost::lexical_cast<int>(s); return 1; } 
 cout << "First integer: "; getline(cin, input); sstream.str(input); sstream >> first; // state of sstream may be eof cout << "Second integer: "; getline(cin, input); sstream.str(input); sstream.clear(); // clear eof state sstream >> second; // input from sstream