2012-04-02 81 views
1

GIven事實上,我生成一個包含隨機長度爲「0」和「1」的字符串,如何將數據寫入文件而不是ascii文本?如何將單個字節寫入到C++文件中

鑑於我的隨機字符串有12位,我知道我應該寫2個字節(或添加4個更多的0位,使16位),以寫第1字節和第2字節。

無論大小,給定我有char [8]或int [8]或字符串數​​組,我怎樣才能在輸出文件中將每個單獨的位組寫成一個字節?

我到處搜索了很多地方(這是我的第三天尋找答案),並不明白如何去做。

謝謝。

+0

您的意思是在您的問題標題中說「位」? – 2012-04-02 19:13:40

+0

字節,目前閱讀所有回覆 – 2012-04-02 19:17:53

回答

2

你還沒有說你在使用什麼API,所以我會假設你正在使用I/O流。爲了將數據寫入到流只是這樣做:

f.write(buf, len); 

你不能寫單位,你會得到最好的粒度是字節。如果你想要位,在寫入之前你必須對你的字節緩衝區做一些按位的工作。

如果你想字符的您8元陣列包成一個字節,你可以做這樣的事情:

char data[8] = ...; 
char byte = 0; 
for (unsigned i = 0; i != 8; ++i) 
{ 
    byte |= (data[i] & 1) << i; 
} 
f.put(byte); 

如果data包含ASCII「0」或「1」字,而不是實際的0或1位與此替換|=行:

byte |= (data[i] == '1') << i; 
+0

和使用fstream(「outfile.txt」,ios:二進制)建議我相信? – 2012-04-02 19:19:27

+0

我會做'ofstream(「outfile.txt」,ios :: out | ios :: binary);'。雖然我不確定.txt擴展名是否有意義,如果你正在編寫二進制數據。 – spencercw 2012-04-02 19:20:42

+0

擴展名與此無關 – 2012-04-02 19:22:05

3

你不用一個位數組來做I/O操作。

相反,您需要執行兩個單獨的步驟。首先,將您的位數組轉換爲數字。然後,使用該數字執行二進制文件I/O。

對於第一個步驟中,將類型uint8_tuint16_t<stdint.h>發現和位處理運算符<<(左移)和|(或)將是有用的。

+0

將調查它 – 2012-04-02 19:21:11

+0

希望我能說是,並接受來自所有人的答案,謝謝大家 – 2012-04-07 18:53:53

2

做一個無符號字符出的比特中的數組:

unsigned char make_byte(char input[8]) { 
    unsigned char result = 0; 
    for (int i=0; i<8; i++)   
     if (input[i] != '0') 
      result |= (1 << i);  
    return result; 
} 

這假設輸入[0]應該成爲字節中最低位,輸入[7]最重要。

+0

如果OP的字符串實際上包含'0'和'1'字符,則需要測試條件,即'input [i]!='0''。 – leftaroundabout 2012-04-02 19:18:45

+0

@leftaroundabout:糟糕 - 非常正確。謝謝。 – 2012-04-02 19:37:42