Использование объекта stringstream несколько раз - PullRequest
0 голосов
/ 16 ноября 2018

Мне трудно обернуть голову вокруг работы 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 голосов
/ 16 ноября 2018

Сначала необходимо создать stringstream, чтобы сделать несколько проходов над тем, что вы прочитали в input.input само по себе является просто string, а не stream.#include <sstream>, а затем после чтения input создайте stringstream с помощью:

std::stringstream stream (input);

Затем вы можете читать с помощью первого цикла while, но второй while не будет работать, поскольку потокпозиция остается в конце строки строк после установки первых while и eofbit.

Вам нужно вызвать stream.seekg(0), чтобы «перемотать» файл и очистить eofbit, см .: std :: basic_istream :: seekg перед вторым while циклом.

0 голосов
/ 16 ноября 2018

Он не опустошен, но как только вы дойдете до конца, вы застряли в конце - как и в случае с другими потоками.

Вам необходимо очистить флаги ошибок (stream.clear()) и затем либо перемотать(stream.seekg(0)) или сбросьте входную строку (stream.str(input)).

0 голосов
/ 16 ноября 2018

stringstream является подклассом istream, поэтому stream >> n (std::istream::operator>>) возвращает reference to istream

stream, который можно преобразовать в bool (std::ios::operator bool):он преобразуется в false, когда у него больше нет данных (достигнут конец файла)

Вы закончили чтение stream в первом цикле - у него больше нет данных.

Если объект потока очищается в конце первого цикла while, есть ли способ обойти его, чтобы вернуть его к исходному состоянию?

Вам нужно сохранять значения самостоятельно, а затемиспользовать их повторно - копирование потоков не разрешено (для них это не имеет смысла) - Почему копирование потока строк не разрешено?

...