2013-06-30 50 views
-3

我有一個問題,我需要寫在文本文件中位C.
我要救一個字符串,其大小爲5個字節,從字符串到二進制文件

char code[] = "0110"; 

在文件位這樣一來,最終的文件大小隻有4位。

Input: size(file) = 5 bytes. 
Output: size(file) = 4 bits. 

我的問題是:是否有一個函數(例如fwrite())在C中可以做到這一點?

+0

我懷疑任何文件系統允許大小的位。你可能會有開銷。你能否提供更多的觀點來解釋你爲什麼這樣做?你可以將它轉換成一個'int'或'char',然後寫入文件。 –

+4

這些老師在家庭作業問題上越來越有想象力! –

+2

stackoverflow是一個問答環節。你有什麼問題? – ouah

回答

1

嘗試將表示二進制數字的字符串轉換爲字符,然後在文件中寫入字節。

由於不能只寫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. 
+0

非常感謝,似乎這是唯一的解決方案:)。 – user2536844

+0

@ user2536844我編輯,因爲你解釋說是實施霍夫曼,這個問題不是直接作業:)。 –

1

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++; 
} 

此代碼將讀取每個字符出串並推通過使用按位運算符10(甚至不需要,因爲初始值是0x00,但效率不是此處關注的問題)轉換爲byte

這是一個非常簡單的例子,你必須弄清楚角落案例(如果輸入字符串只有5個字節),位排序問題(在哪裏放置這5位,在開始或結束時字節?以及開始和結束的含義是什麼?)等等。

+0

非常感謝,我對這個問題有更廣泛的認識。 – user2536844