unsigned char WriteCompressedFile(char *inputFilename, char *outputFilename, HuffmanCodeItem *huffmanCodeArray, int codeTableItems){
//rozmiar bufora danych przygotowanych do budowy z nich bajtów
const int writeBufferSize = 32;
//rozmiar bufora wejsciowego, do którego będą wczytywane bajty pliku wejściowego
const int inputBufferSize = 1024;
//tablica do przechowywania ciągu wartości dziesiętnych "1" i "0", które będą potem zamienione na 1 bajt
unsigned char byteToWrite[8];
//bufor danych przygotowanych do budowy z nich bajtów
unsigned char writeBuffer[writeBufferSize];
//liczba elementów w buforze danych writeBuffer
int writeBufferOffset = 0;
//bufor wejsciowy, do którego będą wczytywane bajty pliku wejściowego
unsigned char inputBuffer[inputBufferSize];
//licznik bajtów odczytanych z pliku wejściowego
int bytesRead;
FILE *inputFileHandle = fopen(inputFilename,"rb"); //otworz plik wejsciowy do odczytu binarnego
while(bytesRead = fread(inputBuffer,sizeof(unsigned char),inputBufferSize,inputFileHandle)){
for(int i=0; i<bytesRead; i++){
//pozyskaj wskaźnik na odpowiedni element w tablicy kodowej na podstawie wartości symbolu
HuffmanCodeItem *code = (HuffmanCodeItem*) GetCodeItemBySymbol(inputBuffer[i],huffmanCodeArray,codeTableItems);
//dla wszystkich elementów słowa kodowego:
for(int j=code->wordLength-1; j >= 0; j-- ){
//do bufora zapisu dopisz kolejną wartość 0 lub 1 ze słowa kodowego
writeBuffer[writeBufferOffset] = code->codeWord[j];
//w buforze przybył jeden element, zwiększamy wskazanie liczby el.
writeBufferOffset++;
//jeśli w buforze zapisu uzbieraliśmy 8 lub więcej elementów,
//to możemy z nich utworzyć jeden bajt
if(writeBufferOffset >= 8) {
//kopiujemy 8 początkowych elementów z bufora zapisu do tablicy przechowującej
//reprezentację bajtu do zapisu - byteToWrite
memcpy(byteToWrite,writeBuffer, 8);
//przekazujemy nasz bajt do funkcji konwertującej tablicę wartości dziesiętnych "0" i "1"
//do postaci bajtu zbudowanego z 8 bitów i zapisującej taki bajt w pliku wyjściowym
WriteBitBufferToFile(outputFilename,byteToWrite,8);
//od indeksu 8 do konca przenosimy dane na poczatek bufora zapisu, aby byly uwzglednione w nastepnym generowanym bajcie
memcpy(writeBuffer,&writeBuffer[8],writeBufferOffset-8);
//wykorzystaliśmy 8 elementów do budowy bajtu, zatem o tyle zmniejszyła nam się liczba elementów w buforze do zapisu
writeBufferOffset = writeBufferOffset-8;
}
}
}
}
fclose(inputFileHandle);
//teraz do pliku musimy dopisać brakujący - niepelny bajt zbudowany z pozostałych w buforze bitow oraz dopełnienia zerami.
//jesli bufor jest pusty, to dopiszemy w pliku informację o tym, że liczba bitów dopełnionych zerami wynosi 0
unsigned char bitsToAppend = 0;
//jeśli w buforze zapisu zostały jakieś niewykorzystane elementy
if(writeBufferOffset > 0){
//do bufora bajtu zapisu wrzucamy bity pozostale w buforze writeBuffer
for(int b=0; b<writeBufferOffset;b++){
byteToWrite[b] = writeBuffer[b];
}
//brakujace bity do pełnego bajtu uzupelniamy zerami
for(int b=writeBufferOffset; b<8;b++){
byteToWrite[b] = 0;
}
//dopisujemy do pliku wygenerowany bajt z uzupelnieniem
WriteBitBufferToFile(outputFilename,byteToWrite,8);
//liczba dopelnionych zerami pozycji to roznica miedzy dlugoscia pelnego bajtu a liczba elementow, ktore pozostaly w buforze zapisu
bitsToAppend = 8-writeBufferOffset;
}
//do pliku dopisujemy na ostatnim bajcie informacje o tym, ile bitow w ostatnim bajcie danych bylo uzupelnieniem.
AppendByteToFile(outputFilename,bitsToAppend);
unsigned int crc = ComputeCRCForFile(outputFilename);
//WriteIntToFile(outputFilename,crc);
printf("Obliczone CRC pliku: 0x%x \n",crc);
return bitsToAppend;
}
problem występuje na koniec nad printf w linijce "unsigned int crc = ComputeCRCForFile(outputFilename);" problemem jest brak deklaracji funkcji "ComputeCRCForFile" co dokładnie powinienem napisać bo po dopisaniu po prostu funkcji na poczatku wywala mi jeszcze gorsze błedy