Pomijanie ostatniego wersu w pliku do odczytu
Ostatnio zmodyfikowano 2017-02-28 19:41
Janusz2 Temat założony przez niniejszego użytkownika |
Pomijanie ostatniego wersu w pliku do odczytu » 2017-02-28 18:25:05 Witam, przy wczytywaniu danych z pliku moje programy pomijają ostatni wers. Jeżeli nie zakończę pliku tekstowego enterem, program po prostu ucina ostatnią linijkę. Oto przykładowy program: #include <fstream> #include <iostream>
void wykonajOperacje( int liczba1, int liczba2, int liczba3 ) { std::cout << liczba1 << " + " << liczba2 << " + " << liczba3 << " = " << liczba1 + liczba2 + liczba3 << std::endl; } bool wczytajPlik( std::string nazwaPliku ) { std::ifstream plik; plik.open( nazwaPliku.c_str() ); if( !plik.good() ) return false; while( true ) { int a; int b; int c; plik >> a >> b >> c; if( plik.good() ) wykonajOperacje( a, b, c ); else break; } return true; }
int main() { if( !wczytajPlik( "liczby.txt" ) ) std::cout << "Nie udalo sie otworzyc pliku!" << std::endl; return 0; }
Oraz przykładowa treść pliku "liczby" "7 2 3 7 4 6 8 2 1" |
|
Bielan |
» 2017-02-28 18:34:58 Poczytaj o tym jak dokładnie działa metoda good. Co zwraca i kiedy: Obsługa strumienia wejściowegoOraz w kontekście wczytywania pliku: Obsługa plikówFlaga eofbit jest ustawiana w momencie napotkania znaku końca linii. Zatem odczytując ostatnią linię napotykasz właśnie ten znak. I co wtedy robi twój if? Wychodzi z pętli. Czy tak powinno być? |
|
Janusz2 Temat założony przez niniejszego użytkownika |
» 2017-02-28 18:52:22 Dzięki wielkie, już łapię, tak powinien wyglądać if: while( true ) { int a; int b; int c; plik >> a >> b >> c; wykonajOperacje( a, b, c ); if( !plik.good() ) break; }
|
|
Bielan |
» 2017-02-28 19:05:03 Jeżeli faktycznie wiesz, że zawsze będziesz miał trzy wartości. Możesz rozważyć sytuację co się stanie kiedy koniec pliku nastąpi pomiędzy wczytaniem "a" i "b". |
|
Janusz2 Temat założony przez niniejszego użytkownika |
» 2017-02-28 19:41:57 Racja. Wtedy zastąpi "b" i "c" losowymi wartościami albo wartościami z poprzedniej pętli. Przed tym mogę się zabezpieczyć nadając im wartość 0 przed pętlą i po wykonajOperacje. |
|
« 1 » |