C++ 帮助管理iostream

C++ 帮助管理iostream,c++,iostream,boost-iostreams,C++,Iostream,Boost Iostreams,假设我得到一个stringbuf,其中包含一些必须删除的字符序列: std::stringbuf string_buff; std::iostream io_stream (&string_buff); io_stream << "part-one\r\npart-two\r\npart-three\r\nEND"; 我想有一些方法可以做到这一点——而且更加优雅——但我找不到方法 顺便说一下。似乎对内部字符串的直接操作不起作用。我说的是: string_buff.str(

假设我得到一个stringbuf,其中包含一些必须删除的字符序列:

std::stringbuf string_buff;
std::iostream io_stream (&string_buff);
io_stream << "part-one\r\npart-two\r\npart-three\r\nEND";
我想有一些方法可以做到这一点——而且更加优雅——但我找不到方法

顺便说一下。似乎对内部字符串的直接操作不起作用。我说的是:

 string_buff.str().clear();
都不是

 io_stream.clear();

不幸的是,我在最初的方法中弄错了

正如我前面提到的,真正的问题与一个
boost::asio::streambuf
有关,我的错误是试图模仿它,在一个单独的控制台应用程序中使用
std::istream
进行测试

当然,使用asio::streambuf y不能像

 strembuf.str("");
所以实际情况是这样的:

 boost::asio::streambuf stream_buff;
 std::iostream response_stream(&stream_buff);
 response_stream << "part-one\r\npart-two\r\npart-three\r\nEND";
boost::asio::streambuf stream\u buff;
std::iostream响应流(&stream\u buff);

响应\u stream您很接近!使streambuf为空的方法是

String_buff.str("");
这将为其分配空字符串


(string_buff.str().clear()只需清空内容的副本:-)

就快到了!使streambuf为空的方法是

String_buff.str("");
这将为其分配空字符串

(string_buff.str().clear()只清空内容的副本:-)

使用

或者,如果需要将行尾替换为其他空白:

string s(string_buf.str());
boost::replace_all(s, "\r\n", " ");
string_buf.str(s);
并且,
stringbuf.str()
返回字符串的副本,而不是对该字符串的引用。

请使用

或者,如果需要将行尾替换为其他空白:

string s(string_buf.str());
boost::replace_all(s, "\r\n", " ");
string_buf.str(s);

而且,
stringbuf.str()
返回的是字符串的副本,而不是对该字符串的引用。

我想你已经搞定了。而且,这里实际上没有问题,所以很好地找到了一个答案:)亚当斯。谢谢你的建议。我必须探索那个图书馆,但我认为我的问题超出了范围。无论如何,我向你保证,你的建议不会被置若罔闻。我认为你说得对。而且,这里实际上没有问题,所以很好地找到了一个答案:)亚当斯。谢谢你的建议。我必须探索那个图书馆,但我认为我的问题超出了范围。无论如何,我向你保证,你的建议不会被置若罔闻。你的问题到底是什么?@Space\u COwbOy正如我在原始帖子的附录中提到的,问题仍然是一样的:抑制某些字符序列,但是在asio::streambuf而不是std::stringbuf中,你的问题是什么?@Space\u COwbOy在我的原始帖子的附录中提到,问题仍然是一样的:抑制某些字符序列,但在asio::streambuf而不是std::stringbuf中。事实上,替换io\u流。seekp(0);由字符串_buff.str(“”)组成的句子;这东西有用。因为真正的问题与boost::asio::streambuf有关,我将检查您的解决方案在该环境中是否仍然有效。我觉得您没有弄乱问题,并且您的解决方案与我的初始问题完全相符。不幸的是,正如我在问题的附录(见上文)中指出的,在模拟问题时出现了错误,并使用std::stringbuf代替了asio:streambuf。无论如何,问题仍然存在。我对boost::asio了解不够,无法在那里找到答案。一般来说,这在很大程度上取决于流的另一端连接了什么。对不起,我帮不了你。即使是这样的评论我也可能感兴趣。也许是因为我怀疑有类似的想法,而且作为一种终极手段,我的想法是做一个内容的简单拷贝,并按照Rob Adams的建议,用一个普通的std::string,甚至是一个asio:string来处理它。在那里,我唯一关心的不是用那些库来填充我的代码。实际上,替换io_流。seekp(0);由字符串_buff.str(“”)组成的句子;这东西有用。因为真正的问题与boost::asio::streambuf有关,我将检查您的解决方案在该环境中是否仍然有效。我觉得您没有弄乱问题,并且您的解决方案与我的初始问题完全相符。不幸的是,正如我在问题的附录(见上文)中指出的,在模拟问题时出现了错误,并使用std::stringbuf代替了asio:streambuf。无论如何,问题仍然存在。我对boost::asio了解不够,无法在那里找到答案。一般来说,这在很大程度上取决于流的另一端连接了什么。对不起,我帮不了你。即使是这样的评论我也可能感兴趣。也许是因为我怀疑有类似的想法,而且作为一种终极手段,我的想法是做一个内容的简单拷贝,并按照Rob Adams的建议,用一个普通的std::string,甚至是一个asio:string来处理它。在那里,我唯一关心的是,我的代码没有被那些图书馆弄得臃肿不堪。
string s(string_buf.str());
boost::erase_all(s, "\r\n");
string_buf.str(s);
string s(string_buf.str());
boost::replace_all(s, "\r\n", " ");
string_buf.str(s);