Ну, с вашим кодом много чего не так, но я не уверен, почему вторая строка не выводится.Когда я пробую код, ваш add_string_output_filter::write
вызывается только один раз (с "string #01\n"
);Я ожидаю, что он будет вызываться каждый раз, когда буфер очищается (так второй раз после второго std::endl
).Но даже если бы он был вызван во второй раз, я не думаю, что результат - это то, что вы ожидаете или хотите.Для строк с префиксами и суффиксами вы должны на самом деле просматривать данные и правильно обрабатывать символ '\n'
.Это намного проще с простым выходным фильтром:
class PrefixAndSuffixLineOutputFilter : public boost::iostreams::output_filter
{
bool isAtStartOfLine;
public:
PrefixAndSuffixLineOutputFilter() : isAtStartOfLine( true ) {}
template <typename Sink>
bool
put( Sink& dest, char ch )
{
static std::string const prefix( "prepending string - " );
static std::string const suffix( " - appended string" );
bool retval = true;
if ( isAtStartOfLine )
retval = boost::iostreams::write( dest, prefix.data(), prefix.size() ) == prefix.size();
if ( retval && ch == '\n' )
retval = boost::iostreams::write( dest, suffix.data(), suffix.size() ) == suffix.size();
if ( retval )
retval = boost::iostreams::put( dest, ch );
isAtStartOfLine = ch == '\n';
return retval;
}
};
В общем, multichar_output_filter
- это оптимизация.Если вы прочтете учебник, в конце он скажет: «Обратите внимание, что реализация write очень похожа на ту, которую вы получили бы, если бы вы поместили реализацию shell_comments_output_filter :: put внутри цикла for с итерацией от 0 до n».действительно ключ: сначала напишите простое output_filter
, и если профилировщик покажет, что вызовы функций вызывают проблемы с производительностью, переключитесь на multichar_output_filter
.(И обратите внимание, что в нем вам понадобится одно и то же состояние, поскольку вы должны будете правильно вывести префикс и суффикс независимо от того, где '\n'
находится в буфере с несколькими символами.)
Я мог бы добавить, чтоisAtStartOfLine
состояние очень часто встречается в выходных фильтрах.(Обратите внимание, что вы не можете просто выводить prefix
после каждого '\n'
, так как это приведет к появлению висящей строки "prefix"
после последнего '\n'
, и не будет "prefix"
в начале первой строки.) Я имелхороший пример этого в моем собственном коде, который вставлял метку времени в начале каждой строки, но Джонатан Турканис не включил этот конкретный пример в свое руководство.