霍夫曼编码:存储字节及其频率从C文件中读取它

时间:2014-08-03 02:58:01

标签: c file-io byte huffman-code

我必须存储字节(256种可能性)及其频率,从文件中读取它并将其存储在结构数组中。

它必须读取简单的文件,如txt,png,mp3和pdf。我知道霍夫曼编码理论,但我有问题得到频率表。我很感激用C语言提示。

例如:读完一个文件后,我得到三个字节:0000 1111,11111 0000,1111 0000

Bytes        Frequency
0000 1111       1
1111 0000       2

这是我到目前为止所得到的:

#define NUM_BYTES 256

typedef struct Node{
    unsigned int frequency;
    char* symbol;
} Node;

GetByteFrequency( char* fileName, Node* table){
    FILE* filep = fopen( fileName, "r" );
    fread(&table, 1, sizeof(char), filep);
    fclose(filep);
}

int main(){
    Node frequencyTable[NUM_BYTES-1];
    GetByteFrequency("text.txt", frequencyTable);
    return 0;
}

这段代码不起作用,只是为了让我知道我在做什么。

2 个答案:

答案 0 :(得分:0)

这取决于您如何在text.txt中存储表格。

我建议一次读取/写入整个数组,这样可以省去解析文件的一些问题。

例如,您可以

char freqTable[NUM_BYTES];
FILE* filep = fopen("data.bin", "wb");
fwrite(freqTable, sizeof(char), NUM_BYTES, filep);

然后直接读取数组

FILE* filep = fopen("data.bin", "rb");
fread(freqTable, sizeof(char), NUM_BYTES, filep);

请注意,数据存储为二进制,因此不需要进行文本解析

答案 1 :(得分:0)

您可以构建一个简单的字节频率表,如下所示:

unsigned freq[256] = {0}; /* indexed by byte values */

int ch;
while ((ch = fgetc(filep)) != EOF) {
    ++freq[ch];
}

循环完成后,freq [0]是字节0发生的次数等等。