例如,字符串流包含“abc “,我想删除最后一个字符' '.
我知道可以先使用 'str' 来完成。
但是没有 stringstream::str() 可以完成吗?
stringstream ss;
ss<<"abc\n";
ss.seekp(-1, std::ios_base::end);
ss << '\0';
编辑:
您可能需要更多
ss.seekp(-1, std::ios_base::end);
之后ss << '\0';
因为在某些情况下带有 ' ' 的字符串是有害的。
不,不存在,至少不能保证。尽管在内部,它维护一个字符串缓冲区,但目前您无法在不创建副本的情况下访问它。有一个提案来改变这一点:
Streams 是 C++ 标准库中最古老的部分,其规范没有考虑自 C++11 以来引入的许多内容。疏忽之一是没有对 basic_stringbuf 的内部缓冲区进行非复制访问,这至少使得获取 ostringstream 的输出结果效率低下,因为总是会进行复制。我个人推测这也是 basic_strbuf 花了这么长时间才因其 char * 访问而被弃用的原因。 有了移动语义和 basic_string_view,就没有理由在 basic_stringbuf 上保持这种悲观情绪了。
在内部,没有理由应该有这个限制,因为我相信(我可能是错的)basic_stringbuf需要一个basic_string缓冲区,并且Clang肯定以这种方式实现basic_stringbuf。
现在,您可以像任何其他流一样进行字符串流,或访问其底层缓冲区的副本,但是,您不能直接修改缓冲区。这意味着任何修改流末尾的尝试都需要复制底层缓冲区或读取字节直到末尾。