Использование оператора << с расширенными фильтрами сжатия iostreams - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь использовать фильтры сжатия iostreams для записи в файл с помощью оператора вставки потока (<<). Название «filtering_ostreambuf» предполагает, что это должно вести себя как поток, но оператор << не определен для этого класса. Вот код, который явно не компилируется. </p>

#include <boost/iostreams/filter/lzma.hpp>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/device/file.hpp>

namespace io = boost::iostreams;

int main() {

  io::filtering_ostreambuf out;
  io::file_sink ofs("output.xz");
  out.push(ofs);
  out.push(io::lzma_compressor());

  for (int i=0; i<16; ++i) {
    out << i << std::endl;
  }

  return 0;
}

Я попытался использовать поток строк в качестве «источника» и использовать для этого функцию повышения iostreams copy (), как в примере для распаковки gzip. Но (1) это не сработает и (2) даже если это сработало, мне это кажется слишком многословным и не похоже, что это будет очень эффективно.

Есть ли способ использовать boost iostreams, чтобы я мог просто нормально записывать в цепочку фильтров, как если бы это был поток? Я хочу использовать << not write (). </p>

1 Ответ

0 голосов
/ 22 мая 2019

Это потому, что вы используете ostreambuf, это просто буфер потока. stream классы являются производными от std::basic_ostream и поддерживают отформатированные операторы «потока» (на самом деле они являются операторами сдвига битов).

Так что это должно работать:

#include <boost/iostreams/filter/lzma.hpp>
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/device/file.hpp>

namespace io = boost::iostreams;

int main() {

  io::filtering_ostream out;
  io::file_sink ofs("output.xz");
  out.push(io::lzma_compressor());
  out.push(ofs);

  for (int i=0; i<16; ++i) {
    out << i << std::endl;
  }

  return 0;
}

В wandbox сбой при связывании невозможен, что понятно, но сама компиляция проходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...