获取字符串流中的最后一个字符而不复制其整个缓冲区

Posted

技术标签:

【中文标题】获取字符串流中的最后一个字符而不复制其整个缓冲区【英文标题】:Obtaining the last character in a stringstream without copying its whole buffer 【发布时间】:2016-04-20 12:13:51 【问题描述】:

如果我使用此代码:

template <typename Streamable>
/* ... */
std::stringstream ss;
ss << function_yielding_a_Streamable();
auto last_char = ss.str().back();

然后(我相信)将需要在ss 的缓冲区中创建字符串的副本,只是为了让我获取最后一个字符,然后它将被销毁。我可以做得更好吗?也许使用seekp() 方法?

【问题讨论】:

为什么首先将string 放入stringstream @Sean:公平的问题,请参阅编辑。 大概,它没有stringstream?也许您可以改用自定义流。 @user2079303:我想……但这不是矫枉过正吗? @einpoklum 取决于function_yielding_a_Streamable 生成的缓冲区有多大,以及除了最后一个字符之外是否需要任何缓冲区。如果它生成兆字节的数据,我认为只存储你需要的而不是整个缓冲区是值得的。 【参考方案1】:

你可以这样做:

char last_char;
std::stringstream ss;
ss << function_yielding_a_Streamable();
ss.seekg(-1,ios::end);//get to the last character in the buffer
ss>>last_char;

【讨论】:

难道我还需要回溯(例如,如果我将其包装在一个函数中,该函数采用 ostringstream& 我想干净利落地行动)? @einpoklum 很抱歉重播晚了,我相信您可以使用 seekp(0) 搜索到开头进行插入。我想你的意思是说 pass stringstream& 而不是 ostringstream& 因为后者你不能访问提取 operator>> 来读取最后一个字符。

以上是关于获取字符串流中的最后一个字符而不复制其整个缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

为啥字符串流的循环给我最后一个字两次[重复]

如何将文件内容读入 istringstream?

字符串流

如何清除字符串流中的内容。? [复制]

从 stringstream 到 string 的转换会删除 '=' 字符

字符串流有啥意义? [复制]