Помощь в управлении iostream - PullRequest
1 голос
/ 17 марта 2011

Предположим, что я получил stringbuf с некоторым содержимым, включающим определенные последовательности символов, которые должны быть удалены:

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();

К сожалению, я ошибся в своем первоначальном подходе

Как я упоминал ранее, настоящая проблема связана с boost::asio::streambuf, и моя ошибка заключалась в попытке имитировать это с std::istream в отдельном консольном приложении для целей тестирования.

Конечно, с asio :: streambuf вы не можете сделать что-то вроде

 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 или любую другую последовательность символов из ввода?

Ответы [ 2 ]

3 голосов
/ 17 марта 2011

Ты рядом!Способ сделать streambuf пустым -

String_buff.str("");

, который назначит ему пустую строку.

(string_buff.str (). Clear () просто очищает copy из содержания: -)

1 голос
/ 17 марта 2011

Использовать 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() возвращает копию , а не ссылку на строку.

...