霍夫曼编码:存储字节,它的频率从文件中读取它,用C语言



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

它必须读取简单的文件,如txt, png, mp3和pdf。我知道霍夫曼编码理论,但我有问题,以获得频率表。我希望你能给我一些C语言方面的建议。

交货。:读取文件后,我得到三个字节:0000 1111,1111 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;
}

这段代码没有按照它的方式工作,它只是给我一个想法,我在做

您可以像这样构建一个简单的字节频率表:

unsigned freq[256] = {0}; /* indexed by byte values */
int ch;
while ((ch = fgetc(filep)) != EOF) {
    ++freq[ch];
}

循环完成后,freq[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);

请注意,数据是以二进制形式存储的,因此不需要进行文本解析

最新更新