多次使用stringstream对象

时间:2018-11-16 10:45:12

标签: c++ stringstream

我发现很难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;
    }

3 个答案:

答案 0 :(得分:2)

stringstreamistream的子类,因此stream >> nstd::istream::operator>>)返回reference to istream

stream可以转换为boolstd::ios::operator bool):当它不再有任何数据(到达文件末尾)时,它将转换为false

您在第一个循环中已经读完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循环之前。