我发现很难stringstream
的工作上全神贯注。为什么下面的代码中的第二个while循环不起作用?如果流对象在第一个while循环结束时被清空,是否有任何变通办法将其恢复到初始状态?
// input is string of numbers separated by spaces (eg. "22 1 2 4")
std::string input;
std::getline(std::cin, input);
stringstream stream (input);
// print individual numbers
while (stream >> n)
{
cout << n << endl;
}
// print individual numbers again
while (stream >> n)
{
cout << n << endl;
}
答案 0 :(得分:2)
stringstream
是istream
的子类,因此stream >> n
(std::istream::operator>>
)返回reference to istream
stream
可以转换为bool
(std::ios::operator bool
):当它不再有任何数据(到达文件末尾)时,它将转换为false
1 >
您在第一个循环中已经读完stream
-不再有任何数据。
如果流对象在第一个while循环结束时被清空,是否有任何变通办法将其恢复到初始状态?
您需要自己存储值,然后再使用它们-不允许复制流(这实际上对它们没有意义)-Why copying stringstream is not allowed?
答案 1 :(得分:2)
它不会被清空,但是一旦到达终点,就如同其他流一样,停留在终点。
您需要清除错误标志(stream.clear()
),然后倒带(stream.seekg(0)
)或重置输入字符串(stream.str(input)
)。
答案 2 :(得分:1)
您需要先创建stringstream
,才能对您读过的input
进行多次遍历。 input
本身只是string
而不是stream
。 #include <sstream>
,然后在阅读input
之后,使用以下方法创建stringstream
:
std::stringstream stream (input);
然后您可以使用第一个while
循环进行读取,但是第二个while
将不起作用,因为流位置在第一个while
和{之后位于字符串组的末尾{1}}已设置。
您需要调用eofbit
来“倒带”文件并清除stream.seekg(0)
,请参阅:std::basic_istream::seekg在第二个eofbit
循环之前。