Использование оператора << с фильтрами сжатия boost iostreams

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

#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;
}

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

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

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
0
147
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это потому, что вы используете 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;
}

При палочка не получается линковать, что понятно, но сама компиляция проходит.

Да, это работает и компилирует для меня ссылки с помощью g++ -o Compress Compress.cpp -std=c++11 -lboost_iostreams -llzma.

emyr666 22.05.2019 15:45

Хорошо знать. Кстати, я изменил порядок в цепочке out, как было предложено вашим редактированием. Глядя на примеры использования, кажется, что приемник файлов действительно должен быть последним. Извините за эту ошибку, но я не смог проверить это во время выполнения. Ваше здоровье.

luk32 22.05.2019 16:09

Другие вопросы по теме