Witam,
mam do napisania projekt, algorytm kompresji huffmana, w sumie już wszytko śmiga całkiem nieźle, ale gdyby nie było żadnych ale, nie zwracałbym się do Was o pomoc. Otóż nie chce działać gdy plik tekstowy zawiera polskie znaki.
Konkretnie program wywraca się w tym miejscu:
void koduj(fstream &plik3, ofstream &plik2, string tablica_kodow[])
{
string linia;
string bajt = ""; //zmienna ktorą konwertuje na int i zapisuję binarnie do pliku gdy osiągnie długość 8 znaków
while(!plik3.eof())
{
getline(plik3, linia);
for(int i = 0 ; i < linia.length() ; i++) //czytam znak po znaku w każdej linii
{
for(int j = 0 ; j < tablica_kodow[static_cast<int>(linia[i])].length() ; j++)//przepisuje kod rozpatrywanego znaku, sprawdzając czy bajt nie osiągnał osmiu znaków
{
bajt = bajt + tablica_kodow[static_cast<int>(linia[i])][j]; //**dokładnie w tej linijce**
if(bajt.length() == 8) //gdy tak, zapisuje binarnie to pliku
{
int kod = bin2dec(bajt);
plik2.write((char*)(&kod), 1);
bajt = "";
}
}
}
//kodowanie entera
}
while(bajt.length() < 8)
{
bajt = bajt + '0';
}
}
Co się dzieje wcześniej:
*plik2 został otwarty do zapisu binarnego, plik3 to analizowany plik z tekstem, znak po znaku;
*tablica_kodow jest tablicą stringów, gdzie każdy element zawiera kod binarny wygenerowany huffmanem, każdego znaku występującego w podanym tekście, gdzie indeks elementu jest kodem ascii danego znaku, np 'a' ma kod 97, występuje w tekście tyle razy, że alg huffmana dał kod 011 dla a, to tablica_kodow[97] = "011";
*Do zliczania znaków w tekscie używam podobnego sposobu, tj
unsigned long long int zlicz_znaki(fstream& plik, unsigned int ilosc_znakow[]) //ilosc_znakow[] przechowuje ilosc znakow dla każdej litery
{
string linia;
unsigned long long int suma_znakow = 0;
while(!plik.eof())
{
getline(plik, linia);
for(int i = 0 ; i < linia.length() ; i++)
{
ilosc_znakow[static_cast<int>(linia[i])]++;
suma_znakow++;
}
ilosc_znakow[13]++; //liczenie enterow
suma_znakow++;
}
return suma_znakow;
}
tylko że tu wszytko gra, polskim znakom zostaje przydzielony jakiś kod, gdy próbuje to wypisać, wychodzą krzaki, ale każdemu polskiemu znakowi odpowiada inny krzak, więc powinno być ok.
*tablice tablica_kodow i ilość_znakow maja po 256 elementów
Z góry dziękuję za jakiekolwiek wskazówki.