problem z kodowaniem polskich znakow

Odpowiedz Nowy wątek
2011-04-10 17:56
darekk
0

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.

Pozostało 580 znaków

2011-04-11 09:30
0
ilosc_znakow[static_cast<int>(linia[i])]++; 

Polskie znaki to kody powyżej 127, zatem przy takim rzutowaniu indeksujesz wartościami ujemnymi, stąd ten błąd. Rzutuj na unsigned char.

edytowany 1x, ostatnio: _0x666_, 2011-04-11 09:33

Pozostało 580 znaków

2011-04-11 16:48
darekk
0

Działa, że aż miło.
Dzięki wielkie.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0