Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++][fstream] Nieudany odczyt danych z pliku za pomocą strumienia >>

Ostatnio zmodyfikowano 2014-05-16 21:41
Autor Wiadomość
Caspinos
Temat założony przez niniejszego użytkownika
[C++][fstream] Nieudany odczyt danych z pliku za pomocą strumienia >>
» 2014-05-16 15:28:25
Witam
Jako ćwiczenie obsługi plików za pomocą biblioteki <fstream> postanowiłem wykonać zadanie 4b z matury z informatyki rozszerzonej z 2012 r.
Niestety nie udaje mi się poprawnie odczytać zawartości plików za pomocą strumienia >> mimo poprawnego ich otworzenia.

Poniżej wklejam kod funkcji, w której występuje w/w problem:

C/C++
bool deszyfruj( ifstream & tekst, ifstream & klucze, ofstream & wynik )
{
    string temp_wyraz;
    string temp_klucz;
    string temp_wynik;
    int temp_znak;
   
    while( !tekst.eof() && !klucze.eof() )
    {
        tekst >> temp_wyraz;
        klucze >> temp_klucz;
       
        if( tekst.fail() || klucze.fail() ) // Tutaj funkcja za każdym razem zwraca wartość false
             return false;
       
        int j = 0;
        for( int i = 0; temp_wyraz[ i ] != '\0'; i++ )
        {
            j++;
            if( temp_klucz[ j ] == '\0' )
                 j = 0;
           
            temp_znak =( int ) temp_wyraz[ i ] +(( int ) temp_klucz[ j ] - 64 );
            if( temp_znak > 90 )
                 temp_znak -= 26;
           
            temp_wynik[ i ] = temp_znak;
        }
        cout << "d: " << temp_wynik << endl;
    }
    return true;
}

Powyższa funkcja za każdym razem zwraca wartość false, co wskazuje na błąd odczytu danych z pliku.
Jeżeli będzie taka potrzeba mogę wkleić kod całego programu.

Bardzo proszę o pomoc w odnalezieniu błędu, ja mimo poświęcenia kilku godzin na próbach rozwiązania problemu dalej nie wiem co jest źle.
Dodatkowo chętnie przyjmę wszelkie rady, uwagi czy krytykę dotyczącą programu.
P-110115
Monika90
» 2014-05-16 15:41:55
Powyższa funkcja za każdym razem zwraca wartość false, co wskazuje na błąd odczytu danych z pliku.
Ta funkcja zwraca false również wtedy gdy dojdzie do końca pliku (lub plików). Np. wtedy gdy obydwa pliki będą się kończyły białym znakiem.
P-110117
Caspinos
Temat założony przez niniejszego użytkownika
» 2014-05-16 15:57:50
Rzeczywiście, ten aspekt obsługi błędów będę musiał jeszcze udoskonalić.
Niestety funkcja oprócz tego, że zwraca wartość false, to nic nie wypisuje, więc jeżeli się nie mylę, to danych nie udało się pobrać nawet raz.
P-110118
Monika90
» 2014-05-16 16:15:30
Sprawdź czy pliki w ogóle udało się otworzyć. Coś jak
C/C++
ifstream tekst( "nazwa.txt" );
if( !tekst )
     cout << "nie udalo sie\n";

P-110120
Caspinos
Temat założony przez niniejszego użytkownika
» 2014-05-16 16:24:11
Sprawdź czy pliki w ogóle udało się otworzyć.
Sprawdzanie czy plik został otworzony poprawnie umieściłem we wcześniejszej części programu, przed uruchomieniem funkcji.
W skrócie weryfikuje czy plik został otworzony w taki sposób:
C/C++
ifstream tekst;
tekst.open( plik_tekst.c_str() );
ifstream klucze;
tekst.open( plik_klucze.c_str() );
if( !tekst.good() || !klucze.good() )
{
    cout << "Blad podczas wczytania ktoregos z plikow!" << endl;
    return false;
}

Za każdym razem plik udaje się otworzyć, więc nie to jest problemem.
P-110122
Jacob99
» 2014-05-16 18:04:23
Zamiast
while( !tekst.eof() && !klucze.eof() )

zrób tak
C/C++
while( tekst >> temp_wyraz &&
klucze >> temp_klucz )
P-110129
Caspinos
Temat założony przez niniejszego użytkownika
» 2014-05-16 18:35:06
Dziękuję za dotychczasowe wskazówki, na ich podstawie przebudowałem funkcję, poniżej zamieszczam jej kod.

C/C++
bool deszyfruj( ifstream & tekst, ifstream & klucze, ofstream & wynik )
{
    string temp_wyraz;
    string temp_klucz;
    string temp_wynik;
    int temp_znak;
   
    while( tekst >> temp_wyraz && klucze >> temp_klucz )
    {
        int j = 0;
        for( int i = 0; temp_wyraz[ i ] != '\0'; i++ )
        {
            j++;
            if( temp_klucz[ j ] == '\0' )
                 j = 0;
           
            temp_znak =( int ) temp_wyraz[ i ] +(( int ) temp_klucz[ j ] - 64 );
            if( temp_znak > 90 )
                 temp_znak -= 26;
           
            temp_wynik[ i ] = temp_znak;
        }
        cout << "d: " << temp_wynik << endl;
    }
   
    if( tekst.eof() || klucze.eof() )
         return true;
    else
         return false;
   
}

Niestety pojawił się inny problem, po wywołaniu funkcji program wypisuje kilkadziesiąt razy (w osobnych wierszach) "d: " po czym Windows powiadamia mnie, że aplikacja przestała działać.
P-110133
MrPoxipol
» 2014-05-16 19:52:52
Z fusów nikt nie będzie wróżyć. Podaj jakiś testowy kod, linijkę na której wywala się program.
P-110137
« 1 » 2
  Strona 1 z 2 Następna strona