【发布时间】:2020-06-18 16:15:07
【问题描述】:
我发现有关 stringstreams 和 getline [C++] 的奇怪行为。
我在做什么?
在正常操作中,我将用于登录的字符串填充到字符串流中,我将其用作简单的自缩放缓冲区。然后在某些事件上,我使用 getline 从缓冲区流过滤器 em 中提取特定标准的完整行,如果它们匹配,我将这些行放入一个或多个输出流以生成日志输出(在屏幕上,到文件,你可以命名它。 ..)。在我的程序终止的情况下 - 正常或异常,我想获取缓冲区中剩余的内容(不完整的行 [s])并将其放入输出流。为此,我认为 stringstream 的普通 str() 方法可以完成这项工作。
不幸的是,getline 似乎没有消耗提取的行,因此 str() 复制了我自程序启动以来的完整日志。哪个
- 产生不需要的输出
- 必须导致日志缓冲区不断增长(在给定时间点消耗所有内存)
这个 samal 演示显示了问题:
#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 在这里太多了。
【问题讨论】:
-
en.cppreference.com/w/cpp/string/basic_string/getline 读取关于 delimiter 参数的位。
-
你的问题的答案:你不能。一旦将某些内容添加到
std::stringstream,它就会永久存在,直到std::stringstream本身被破坏。这是std::stringstream工作的唯一方式,您无法更改它。 -
看来你(谢谢)刚刚证实了我个人对这种情况的理解。已经开始实施合适的替代品...
标签: c++ std getline stringstream