2009-12-09 42 views
2

經過大量搜索解決方案後,我決定實際尋求一些幫助!將Fstream的一部分複製到Istringstream中

我有一個由多個塊組成的文件,其中每個塊都可能被壓縮,也可能不被壓縮。在每個塊之前顯示塊的大小以及塊是否被壓縮。每個塊內有一個標識塊的字符串。給定一個塊名稱,我想從文件中獲取相關的塊。

我的第一個想法是讀取壓縮標誌和塊的大小,只將塊讀入istringstream,如果需要解壓縮istringstream,然後搜索塊名稱。我可以讀取壓縮標誌和塊的大小,但是我不知道如何將文件數據塊讀入istringstream。我看到人們將整個文件讀入istringstream,但我不想這樣做,因爲每個塊可能需要或可能不需要解壓縮。

任何想法或鏈接到我錯過的解決方案?還是有更好的算法?感謝您的任何意見。

+0

這是一個重複關閉:http://stackoverflow.com/questions/132358/how-to-read-file-content-into-istringstream/138645 – 2009-12-09 20:46:53

+0

不,他特別要求只部分讀取文件。 – Potatoswatter 2009-12-23 08:02:47

回答

0

未經檢驗的,但這樣的事情應該工作:

// open file, and seek to the appropriate position 
// read 'length', the size of your chunk in bytes 
std::vector<char> buffer(length); 
file.read(&buffer[0],length); 
file.close(); 
// decompress or manipulate the buffer as needed 
std::istringstream iss; 
iss.rdbuf()->pubsetbuf(&buffer[0],length); // here's the magic 
2

爲什麼需要將數據讀入內存流;爲什麼不把它讀入數組或std::vector

+0

如果你的解壓縮例程使用C風格的字符串,並且你知道前面的緩衝區大小,那麼你應該只是讀入一個字符數組。 – mrkj 2009-12-23 17:09:38

0

我喜歡一個流,因爲我的解壓縮例程使用C風格的字符串。

但是,我應該能夠將std :: vector轉換爲壓縮/解壓縮例程所需的東西,所以一旦我讀取部分工作,我會研究它。

一個單獨的組件將所有這些從塊中拉出有用的數據。我實際上並沒有仔細研究istringstream的讀法,因此取決於如何去決定可能決定我希望從istringstream的std :: vector過程中進行處理。

感謝你們倆。看起來我必須解釋Bjarne關於pubsetbuf的說法:)。

+0

您可以施放std :: vector v;到一個C風格的字符串就好:&v [0]和size v.size()。請注意,它們不會縮小。 – piotr 2009-12-23 09:09:12

0

使用迭代器。

my_fstream >> compressed_size; 
stringstream compressed_data; 
istream_iterator<char> file_fetch_iter(my_fstream); 
ostream_iterator<char> buffer_put_iter(compressed_data); 

for (size_t i = 0; i < compressed_size; ++ i) { 
    * buffer_put_iter ++ = * file_fetch_iter ++; 
} 

legacy_decompressor(compressed_data); 
0

流,顧名思義是用於流式文本或二進制處理。您對讀取塊感興趣,因此將數據導入字符串流對我來說沒有多大意義。

一個優雅的方法是實現自己的流,使用std :: streambuf等作爲基礎。然後你將在輸入處讀取和緩衝塊,處理壓縮與否,並在輸出處有一個數據流,在這裏你可以用普通的操作符正確地讀取數據到字符串,整數等。

否則你是使用流讀取方法卡住,就像系統調用將數據讀入緩衝區一樣。在這種情況下,我建議將數據讀入矢量中,不要使用額外的字符串流來減慢速度。

你可以找到在網絡上實現你自己的流類的例子,比如gzstream。本書Standard C++ Iostreams和Locales書籍也很有用。

相關問題