我對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;
}
一個可編譯的測試用例總是打敗文本的牆。 – YeenFei 2010-06-28 00:53:59
我遇到了類似的問題: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