2010-06-28 6 views
4

У меня есть следующий вопрос на 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; 
    } 
+0

сборный чехол всегда бьет стену с текстом. – YeenFei

+0

У меня возникла аналогичная проблема: http://stackoverflow.com/questions/224234/is-there-a-way-to-check-if-an-istream-was-opened-in-binary-mode – Ferruccio

ответ

1

Короткий ответ для чтения файла в двоичном виде:

указать ios_base::binary при открытии файла потока.

MSDN Link

+0

Это выглядит хорошо. Но есть ли у меня какой-либо вариант, например, заставить мой «фильтр» работать только тогда, когда соответствующее устройство находится в режиме «двоичный»? Или это невозможно проверить? –

+0

Что вы имеете в виду в случае «устройств двоичного режима»? – YeenFei