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: 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() ) 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. |
|
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. |
|
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. |
|
Monika90 |
» 2014-05-16 16:15:30 Sprawdź czy pliki w ogóle udało się otworzyć. Coś jak ifstream tekst( "nazwa.txt" ); if( !tekst ) cout << "nie udalo sie\n";
|
|
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: 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. |
|
Jacob99 |
» 2014-05-16 18:04:23 Zamiast while( !tekst.eof() && !klucze.eof() ) zrób tak while( tekst >> temp_wyraz && klucze >> temp_klucz )
|
|
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. 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ć. |
|
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. |
|
« 1 » 2 |