2015-05-09 124 views
0

我正在編寫一個程序,它將讀取和寫入指定文件內容的文件格式,逐字節。這個程序的本質是前兩個字節詳細說明在該文件的該部分留下了多少字節,接下來是另外兩個字節,表示該文件的部分實際表示的內容。該模式對文件的長度重複。這意味着我必須寫出由前面的零緩衝的確切數字,以便每個組件都是它需要的確切大小。我已經寫了,說明我的觀點一個虛擬文件:使用ofstream編寫前面的零

#include <fstream> 
#include <stdint.h> 

int main() { 
    std::ofstream outputFile; 
    outputFile.open("test.txt", 
      std::ios::out | std::ios::ate | std::ios::binary); 
    const int16_t HEADER = 0x0002; 
    int16_t recordSize = 2*sizeof(int16_t); 
    int16_t version = 0x0258; 
    outputFile << recordSize << HEADER << version; 
    outputFile.close(); 
} 

它寫了一個名爲「test.txt的」誰是十六進制文件的內容是:

34 32 36 30 30 

,併爲那些我們可以直讀十六進制這意味着:

42600 

正如你可以看到前面的零被刪除,我的記錄不是我希望它是。有沒有辦法使用ofstream來緩衝我的數字爲零,因爲我天真地試圖通過使用int16_t來處理所有的寫入操作,我想要的長度只有兩個字節?是否有另外一種可能更具風格正確的方法?

回答

2

運營商< <用於文本格式。你可能想使用.write()來代替。

例如

outputFile.write(reinterpret_cast<char*>(&recordSize), sizeof(int16_t)); 
outputFile.write(reinterpret_cast<char*>(&HEADER), sizeof(int16_t)); 
// ... 
+1

一致認爲這是任何「真正的」二進制格式所需要的。另一個可能的問題是排序 - 而「hton」/'ntoh'等是對此的有用支持。文件內容也可能是固定寬度的文本字段,在這種情況下,OP應該堅持'<<',但是看看'std :: setfill'和'std :: setw'。 –

+0

有沒有類似的東西我應該用來閱讀,這會給我相同的保證嗎?一旦我有時間測試它,並且如果適用,我會用「接受的答案」來標記它。謝謝! – user3854447