2010-06-28 54 views
4

我對boost::iostreams有以下問題。如果有人熟悉書寫過濾器,我會真正感謝您的建議/幫助。如何獲取boost :: iostream以與std :: ios :: binary相媲美的模式運行?

我正在寫一對multichar過濾器,與boost::iostream::filtering_stream一起使用,作爲數據壓縮和解壓縮程序。 我開始寫一個壓縮器,從lz-family中選擇了一些算法,現在我正在使用一個解壓縮器。

幾句話,我的壓縮器將數據分成數據包,它們被分開編碼,然後刷新到我的文件。

當我從我的文件恢復數據(在編程方面,收到read(byte_count)要求),我要讀包裝塊,bufferize它,解開它,然後纔給請求的字節數。 我實現這個邏輯,但現在我與掙扎以下問題:


當我的數據打包,任何符號可以出現在輸出文件中。讀取文件時遇到問題,其中包含使用boost::iostreams::read(...., size)的符號(hex 1A, char 26)

例如,如果我使用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 2010-06-28 00:53:59

+0

我遇到了類似的問題:http://stackoverflow.com/questions/224234/is-there-a-way-to-check-if-an-istream-was-opened-in-binary-mode – Ferruccio 2011-11-23 02:05:23

回答

1

簡短的回答閱讀文件爲二進制:

打開文件流時指定ios_base::binary

MSDN Link

+0

這看起來像精細。但我有什麼選擇,例如強制我的'過濾器'只有當相應的設備處於'二進制'模式工作?或者這個不能被檢查? – 2010-06-28 01:06:52

+0

你在「二元模式設備」中提到了什麼? – YeenFei 2010-06-28 14:09:12

相關問題