ifstream inStream;
inStream.open(filename.c_str(), fstream::binary);
if(inStream.fail()){
cout<<" Error in opening file: "<<filename;
exit(1);
}
假設我們只想處理文件中的各個位。我知道我們可以通過字符來讀取char文件,但是我們可以輕鬆一點一點地讀取它嗎?如何處理文件中的位?
ifstream inStream;
inStream.open(filename.c_str(), fstream::binary);
if(inStream.fail()){
cout<<" Error in opening file: "<<filename;
exit(1);
}
假設我們只想處理文件中的各個位。我知道我們可以通過字符來讀取char文件,但是我們可以輕鬆一點一點地讀取它嗎?如何處理文件中的位?
文件通常以大於一位(通常是一個字節或以上)的單位讀取。單個位文件仍然至少需要一整個字節(實際上,根據文件系統,磁盤需要多個字節,但長度可以以字節爲單位)。
但是,您可以在每次提供下一位的流中編寫一個包裝,同時在內部讀取一個字符,每當詢問時提供一些位,並在不能再請求時從文件中讀取下一個字符從前一個字符中填充。我假設你知道如何將一個字節(或字符)變成一系列位。
由於這是作業,您可能希望自己寫這個,而不是使用現有的 庫。
您必須逐字節讀取文件,然後根據需要從讀取字節中提取位。在位級無法做IO。
我猜你的二進制文件是huffman編碼和壓縮文件。你必須讀取字節的文件字節,然後提取使用逐運營商如從這些字節位:
char byte;
// read byte from file.
unsigned char mask = 0x80; // mask for bit extraction.
byte & mask // will give you the most significant bit.
byte <<= 1; // will left sift the byte by 1 so that you can read the next MSB.
可以使用讀取位下降哈夫曼樹,直到你到達葉節點,在這指出你已經解碼了一個符號。
當您將字節的位移位1時,最低有效位(最右邊)=空? – Azreal 2010-03-02 18:26:47
@Azreal:它將爲零。如果0xFF(1111 1111)左移,我們將得到0xFE(1111 1110) – codaddict 2010-03-02 18:38:04
您是不是指byte >> = 1? – jmucchiello 2010-03-02 19:01:10
根據你在做什麼位,它可能更容易讀取32位的字而不是字節。無論哪種情況,你都要做面具和換班操作,其中的具體細節留給讀者來說是衆所周知的。 :-)如果需要多次嘗試,不要氣餒;我必須經常適度地做這種事情,而且我經常第一次遇到錯誤。
任何超過一個字節的內容都可能導致endian問題。不要這樣做。 – jmucchiello 2010-03-02 19:01:56
爲什麼不逐字節處理它並查看每個字節的相關位? – 2010-03-02 17:51:43
這也可以工作,但我不知道如何從C++中的字節讀取位。 – Azreal 2010-03-02 18:27:44
使用按位運算符('&','|','^')和掩碼來操作各個位。你會閱讀字符,但可能想要將它們轉換爲「無符號字符」,以使您可以更輕鬆地對該位進行可視化處理。 – 2010-03-03 01:43:04