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