C ++ stringstreams, почему getline не потребляет содержимое потока? - PullRequest
0 голосов
/ 06 марта 2020

Я обнаружил странное поведение в отношении потоков строк и getline [C ++].

Что я делаю?

В обычной работе я заполняю строки для входа в поток строк, которые я использую как простой сам масштабирующийся буфер. Затем в определенных событиях я использую getline для извлечения полных строк из фильтра буферного потока em для определенных критериев, и, если они совпадают, я помещаю такие строки в один или несколько выходных потоков для генерации вывода журнала (на экране, в файлы, которые вы называете). ..). В случае завершения моей программы - нормальной или ненормальной, я хочу захватить то, что осталось в буфере (неполная строка [s]), а также поместить это в выходные потоки. Для этого я думал, что нормальный метод str () stringstream сделает эту работу.

к сожалению, оказывается, что getline, похоже, не использует извлеченные строки, поэтому str () копирует мой полный журнал с момента запуска программы. Который

  1. производит нежелательный вывод
  2. должен привести к постоянно растущему буферу журналов (потребляя всю память в данный момент времени)

Это сам Демонстрация показывает проблему:

#include <iostream>
#include <sstream>

using namespace std;

int main(int argc, char **argv)
{
    stringstream ss;

  ss << "1\n1";
  ss << "22\n22";
  ss << "333\n333";
  ss << "4444\n4444";
  ss << "55555\n55555";
  ss << "666666\n666666";
  ss << "7777777\n7777777";

  for (std::string line; std::getline(ss, line); ) {
    cout << line << ",";
  }
  cout << "\n";

  cout << ss.str() << "\n";

    return 0;
}

И в результате получается:

1,122,22333,3334444,444455555,55555666666,6666667777777,7777777,
1
122
22333
3334444
444455555
55555666666
6666667777777
7777777
Hit any key to continue...

Итак, первая строка вывода - это то, что извлекает getline, а затем std () по-прежнему возвращает полную строку из потока.

Также я немного озадачен, почему getline также извлекает последний "7777777", так как за ним не следует разрыв строки.

Поэтому мой вопрос, как извлечь строки и только строки, за которыми следует '\ n' из потока строк, извлекаются в том смысле, что: то, что читается из потока строк, больше не находится в потоке строк и также оставляет незавершенными строки нетронутыми внутри потока - для последующей обработки.

PS: я не могу использовать boost, его встроенный материал и boost - вот здесь многое.

1 Ответ

0 голосов
/ 06 марта 2020

Во-первых, getline может быть завершено условием конца файла, а не только ограничителем строки. Так что это объясняет вашу последнюю строку.

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

Нет команды для удаления из памяти только тех битов, которые вы до сих пор читали; если вы хотите эту функциональность, то stringstream не тот класс, который нужно использовать. Возможно, вам придется свернуть свою собственную структуру FIFO, например, использовать queue<string> для поддержки интерфейса потокового ввода.

Или, возможно, вы можете очистить буфер потока строк, когда закончите извлекать из него все (это выглядит как обычное использование для буфер журнала?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...