Program kompresujący metodą Huffmana - brak odczytu danych z pliku

0

Witam serdecznie!
Od dwóch dni siedzę nad pewnym problemem i w żaden sposób nie jestem w stanie go rozwiązać...
Otóż, pracowałem nad programem kompresującym metodą Huffmana, który pobiera tabelę kodową przyporządkowującą każdemu znakowi ciąg jedynek i zer zawartą w pliku pliku z rozszerzeniem .sort (który mogę w razie czego udostępnić) oraz plik w formacie .txt, na którego podstawie owa tabela została stworzona.

Analizowany problem pojawia się w pierwszym warunku 'if' po pętli 'while' tj. if(!plik_odczyt.good()) break;. .odczyt() przyjmuje zawsze wartość false. Niezależnie od pliku, jaki podam jako argument podczas uruchamiania programu (plik ten nie jest pusty oraz nigdzie indziej nie wykonuję na nim żadnych operacji) programu nie może go wczytać i "break" wychodzi z całej pętli.
Plik do odczytu wyżej otwiera się poprawnie, problem jest z ".good()".
W identyczny sposób wczytuję do programu plik z tabelą kodową i wszystko jest w porządku... Bardzo prosiłbym o pomoc, niestety nie mam już pojęcia co robić... :(

Z góry dziękuję!

Tu cały kod programu: http://pastebin.com/93db8FMY

Poniżej zamieszczam kod źródłowy funkcji odpowiedzialnej za kompresowanie:

 int kompresowaniePliku(string nazwa_pliku_wejsciowego, ifstream &plik_odczyt, ofstream &plik_zapis, lista** glowa)
{
    unsigned char bajt_8b;
    long zapis_bajt_8b;
 
    string nazwa_pliku_huff = zmienRozszerzenie(nazwa_pliku_wejsciowego, ".huff");
 
    plik_odczyt.open(nazwa_pliku_wejsciowego.c_str(), ios::binary);
    if (!plik_odczyt.is_open())
    {
        cout << "### Blad otwierania pliku do skompresowania w trybie binarnym!" << endl;
        return -1;
    }
 
    plik_zapis.open(nazwa_pliku_huff.c_str(), ios::binary);
    if (!plik_zapis.is_open())
    {
        cout << "### Blad otwierania pliku do zapisu w trybie binarnym!" << endl;
        return -1;
    }
 
    lista *symbolSzukany = NULL;
    string lancuchKodowy = "00000000";
 
    zapis_bajt_8b = strtol(lancuchKodowy.c_str(), NULL, 2);
    plik_zapis.put(zapis_bajt_8b);
    lancuchKodowy.clear();
 
    while (true)
    {
        bajt_8b = plik_odczyt.get();
        if (!plik_odczyt.good()) break;
 
        symbolSzukany = przeszukajListe(glowa, (int)bajt_8b);
        lancuchKodowy = lancuchKodowy + symbolSzukany->kod;
 
        if (lancuchKodowy.length() >= 8)
        {
            while (lancuchKodowy.length() >= 8)
            {
                string tmpString = lancuchKodowy.substr(0,8);
                zapis_bajt_8b = strtol(tmpString.c_str(), NULL, 2);
                plik_zapis.put(zapis_bajt_8b);
                lancuchKodowy.erase(0, 8);
            }
        }
    }
 
    if (lancuchKodowy.length() != 0)
    {
        while (lancuchKodowy.length() >= 8)
        {
            string tmpString = lancuchKodowy.substr(0, 8);
            zapis_bajt_8b = strtol(tmpString.c_str(), NULL, 2);
            plik_zapis.put(zapis_bajt_8b);
            lancuchKodowy.erase(0, 8);
        }
 
        char iloscBitowDoDodania = 8 - lancuchKodowy.length();
        for (int i = 0; i < iloscBitowDoDodania; i++)
            lancuchKodowy = lancuchKodowy + "0";
 
        zapis_bajt_8b = strtol(lancuchKodowy.c_str(), NULL, 2);
        plik_zapis.put(zapis_bajt_8b);
 
        lancuchKodowy.clear();
        plik_zapis.seekp(0, ios::beg);
        plik_zapis.put((int)iloscBitowDoDodania);
    }
 
    plik_odczyt.close();
    plik_zapis.close();
 
    cout << "Plik skompresowany!" << endl;
 
    return 0;
} 
1

Nie korzystasz może z jakieś starszej wersji Dev'a? Na nowym Devie mi śmiga okej wszystko.

0

Zgadza się, używam wersji wymaganej na laboratoriach - 4.9.9.2, lecz nie wiem co zrobić, program crashuje przy wczytywaniu .txt...

0

wersji wymaganej na laboratoriach - 4.9.9.2

Ta wersja ma zabugowany wbudowany kompilator. Musisz przerabiać kod tak, aż ominiesz jego bugi.

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