簡體   English   中英

霍夫曼編碼:以C形式存儲字節以及從文件中讀取字節的頻率

[英]Huffman Coding: storing bytes and it's frequency reading it from a file, in C

我必須存儲字節(256種可能性)及其頻率,從文件中讀取字節並將其存儲在結構數組中。

它必須讀取簡單的文件,如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;
}

這段代碼無法正常工作,只是給我一個想法。

這取決於您如何在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);

請注意,數據以二進制形式存儲,因此不需要文本解析

您可以建立一個簡單的字節頻率表,如下所示:

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

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

循環完成后,freq [0]是字節0發生了多少次,依此類推。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM