У меня есть следующий вопрос на boost::iostreams
. Если кто-то знаком с написанием фильтров, я бы оценил ваши советы/помощь.Как получить boost :: iostream для работы в режиме, сопоставимом с std :: ios :: binary?
Я пишу пару многоканальных фильтров, которые работают с boost::iostream::filtering_stream
как данных компрессора и декомпрессора. Я начал с написания компрессора, взял какой-то алгоритм из семейства lz и теперь работаю над декомпрессором.
В нескольких словах мой компрессор разбивает данные на пакеты, которые кодируются отдельно, а затем очищаются до моего файла.
Когда я должен восстановить данные из моего файла (в терминах программирования, получить read(byte_count)
запрос), я должен прочитать полный упакованный блок, bufferize его, распаковать его и только потом дать требуемое число байтов , Я реализовал эту логику, но сейчас я борюсь с следующей задачей:
Когда мои данные упаковываются любые символы могут отображаться в выходном файле. И у меня проблемы при чтении файла, который содержит символ (hex 1A, char 26)
, используя boost::iostreams::read(...., size)
.
Если бы я использовал std::ifstream
, например, я бы установил режим std::ios::binary
, и тогда этот символ можно было бы просто прочитать.
Любой способ достижения этого при реализации фильтра boost::iostream
, который использует процедуру boost::iostream::read
для считывания последовательности символов?
Некоторые код здесь:
// Compression
// -----------
filtering_ostream out;
out.push(my_compressor());
out.push(file_sink("file.out"));
// Compress the 'file.in' to 'file.out'
std::ifstream stream("file.in");
out << stream.rdbuf();
// Decompression
// -------------
filtering_istream in;
in.push(my_decompressor());
in.push(file_source("file.out"));
std::string res;
while (in) {
std::string t;
// My decompressor wants to retrieve the full block from input (say, 4096 bytes)
// but instead retrieves 150 bytes because meets '1A' char in the char sequence
// That obviously happens because file should be read as a binary one, but
// how do I state that?
std::getline(in, t); // <--------- The error happens here
res += t;
}
сборный чехол всегда бьет стену с текстом. – YeenFei
У меня возникла аналогичная проблема: http://stackoverflow.com/questions/224234/is-there-a-way-to-check-if-an-istream-was-opened-in-binary-mode – Ferruccio