1

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

std::stringbuf string_buff;
std::iostream io_stream (&string_buff);
io_stream << "part-one\r\npart-two\r\npart-three\r\nEND";

在那里,必须删除 CRLF 对,所以我测试了一些:

int pos = 0;
while (true) {
    pos = string_buff.str().rfind("\r\n");
    if (pos == string_buff.str().npos) {
        break;
    } else {
        std::string preamble = string_buff.str().substr(0, pos);
        std::string postamble = string_buff.str().substr(pos +2);
        io_stream.seekp(0);
        io_stream << preamble << postamble;
    }
}

但序列保持相同的长度。所以,我得到以下结果:

 part-onepart-twopart-threeENDNDNDND

我想有一些方法可以做到这一点——而且更优雅——但我找不到方法。

顺便一提。似乎对内部字符串的直接操作不起作用。我说一些类似的东西:

 string_buff.str().clear();

两者都不

 io_stream.clear();

或者

 io_stream.flush();

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

正如我之前提到的,真正的问题与 a 有关,boost::asio::streambuf而我的错误是试图模仿它,将 astd::istream在单独的控制台应用程序中用于测试目的。

当然,使用 asio::streambuf y 不能做一些 as

 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";

我为混乱道歉。

问题保持不变:如何从输入中删除 CRLF -或任何其他字符序列?

4

2 回答 2

3

You are close! The way to make the streambuf empty is

String_buff.str("");

That will assign it the empty string.

(string_buff.str().clear() just empties a copy of the contents :-)

于 2011-03-17T20:01:42.123 回答
1

使用Boost.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);

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

于 2011-03-17T20:21:32.470 回答