我有一個問題,我需要寫在文本文件中位C.
我要救一個字符串,其大小爲5個字節,從字符串到二進制文件
char code[] = "0110";
在文件位這樣一來,最終的文件大小隻有4位。
Input: size(file) = 5 bytes.
Output: size(file) = 4 bits.
我的問題是:是否有一個函數(例如fwrite())在C中可以做到這一點?
我有一個問題,我需要寫在文本文件中位C.
我要救一個字符串,其大小爲5個字節,從字符串到二進制文件
char code[] = "0110";
在文件位這樣一來,最終的文件大小隻有4位。
Input: size(file) = 5 bytes.
Output: size(file) = 4 bits.
我的問題是:是否有一個函數(例如fwrite())在C中可以做到這一點?
嘗試將表示二進制數字的字符串轉換爲字符,然後在文件中寫入字節。
由於不能只寫4位,所以會產生一些開銷。
char *in = "0110";
char out = 0;
int i = 0;
while (in[i] != '\0') {
out = out * 2 + in[i] - '0';
i++;
}
// Write out in your file.
非常感謝,似乎這是唯一的解決方案:)。 – user2536844
@ user2536844我編輯,因爲你解釋說是實施霍夫曼,這個問題不是直接作業:)。 –
C API將(合理地)不會讓您將4位寫入文件。 我也不認爲有一個文件系統在那裏將保持記錄的內容爲半個字節! 這只是說你想要做的是將一串字符串1
s和0
s解釋爲字節中的一串位。
爲了做到這一點,你必須寫出比特。 這通常是通過按位運算符來實現的。
因此,舉例來說,如果你有一個8個字節10011100
「流」,可以包用下面的代碼一個字節:
char *sb = "10011100";
unsigned char next = 0; // Next bit to process
unsigned char pos = 0; // Position of next bit
unsigned char byte = 0; // Where to store the result
for (i = 0; i < 8; i++) {
if ((*sb) == '1') {
next = 0x01;
}
else {
next = 0x00;
}
byte |= next << pos;
pos++;
}
此代碼將讀取每個字符出串並推通過使用按位運算符1
或0
(甚至不需要,因爲初始值是0x00
,但效率不是此處關注的問題)轉換爲byte
。
這是一個非常簡單的例子,你必須弄清楚角落案例(如果輸入字符串只有5個字節),位排序問題(在哪裏放置這5位,在開始或結束時字節?以及開始和結束的含義是什麼?)等等。
非常感謝,我對這個問題有更廣泛的認識。 – user2536844
我懷疑任何文件系統允許大小的位。你可能會有開銷。你能否提供更多的觀點來解釋你爲什麼這樣做?你可以將它轉換成一個'int'或'char',然後寫入文件。 –
這些老師在家庭作業問題上越來越有想象力! –
stackoverflow是一個問答環節。你有什麼問題? – ouah