GIven事實上,我生成一個包含隨機長度爲「0」和「1」的字符串,如何將數據寫入文件而不是ascii文本?如何將單個字節寫入到C++文件中
鑑於我的隨機字符串有12位,我知道我應該寫2個字節(或添加4個更多的0位,使16位),以寫第1字節和第2字節。
無論大小,給定我有char [8]或int [8]或字符串數組,我怎樣才能在輸出文件中將每個單獨的位組寫成一個字節?
我到處搜索了很多地方(這是我的第三天尋找答案),並不明白如何去做。
謝謝。
GIven事實上,我生成一個包含隨機長度爲「0」和「1」的字符串,如何將數據寫入文件而不是ascii文本?如何將單個字節寫入到C++文件中
鑑於我的隨機字符串有12位,我知道我應該寫2個字節(或添加4個更多的0位,使16位),以寫第1字節和第2字節。
無論大小,給定我有char [8]或int [8]或字符串數組,我怎樣才能在輸出文件中將每個單獨的位組寫成一個字節?
我到處搜索了很多地方(這是我的第三天尋找答案),並不明白如何去做。
謝謝。
你還沒有說你在使用什麼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;
和使用fstream(「outfile.txt」,ios:二進制)建議我相信? – 2012-04-02 19:19:27
我會做'ofstream(「outfile.txt」,ios :: out | ios :: binary);'。雖然我不確定.txt擴展名是否有意義,如果你正在編寫二進制數據。 – spencercw 2012-04-02 19:20:42
擴展名與此無關 – 2012-04-02 19:22:05
你不用一個位數組來做I/O操作。
相反,您需要執行兩個單獨的步驟。首先,將您的位數組轉換爲數字。然後,使用該數字執行二進制文件I/O。
對於第一個步驟中,將類型uint8_t
和uint16_t
在<stdint.h>
發現和位處理運算符<<
(左移)和|
(或)將是有用的。
將調查它 – 2012-04-02 19:21:11
希望我能說是,並接受來自所有人的答案,謝謝大家 – 2012-04-07 18:53:53
做一個無符號字符出的比特中的數組:
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]最重要。
如果OP的字符串實際上包含'0'和'1'字符,則需要測試條件,即'input [i]!='0''。 – leftaroundabout 2012-04-02 19:18:45
@leftaroundabout:糟糕 - 非常正確。謝謝。 – 2012-04-02 19:37:42
您的意思是在您的問題標題中說「位」? – 2012-04-02 19:13:40
字節,目前閱讀所有回覆 – 2012-04-02 19:17:53