Я обнаружил странное поведение в отношении потоков строк и getline [C ++].
Что я делаю?
В обычной работе я заполняю строки для входа в поток строк, которые я использую как простой сам масштабирующийся буфер. Затем в определенных событиях я использую getline для извлечения полных строк из фильтра буферного потока em для определенных критериев, и, если они совпадают, я помещаю такие строки в один или несколько выходных потоков для генерации вывода журнала (на экране, в файлы, которые вы называете). ..). В случае завершения моей программы - нормальной или ненормальной, я хочу захватить то, что осталось в буфере (неполная строка [s]), а также поместить это в выходные потоки. Для этого я думал, что нормальный метод str () stringstream сделает эту работу.
к сожалению, оказывается, что getline, похоже, не использует извлеченные строки, поэтому str () копирует мой полный журнал с момента запуска программы. Который
- производит нежелательный вывод
- должен привести к постоянно растущему буферу журналов (потребляя всю память в данный момент времени)
Это сам Демонстрация показывает проблему:
#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 - вот здесь многое.