Odczyt danych z pliku (.txt)
Ostatnio zmodyfikowano 2015-05-16 14:24
Huxyf Temat założony przez niniejszego użytkownika |
Odczyt danych z pliku (.txt) » 2015-05-15 22:14:58 Witam, Pomimo, iż wykorzystałem wszelkie zabezpieczenia omawiane w ostatnich lekcjach tutejszego kursu, program nie radzi sobie z pustym wierszem na końcu pliku. Mówiąc bardziej konkretnie to flaga metody fail() zamyka program. Proszę o wskazówki jak temu zapobiec. #include <iostream> #include <string> #include <fstream>
using namespace std;
bool Wczytaj_co_sie_da( string dane[], string sciezka ) { int i = 0; string zmienna; ifstream plik; plik.open( sciezka.c_str() ); if( !plik.good() ) { cout << "Brak dostepu do pliku!" << endl; return false; } while( !plik.eof() ) { plik >> zmienna; if(( !plik.bad() ) &&( plik.fail() == true ) ) { cout << "Nieudana proba odczytu danych z powodu innego typu danych!" << endl; return false; } else if(( plik.bad() == true ) ||( plik.fail() == true ) ) { cout << "Nieudana proba odczytu danych z powodu bledu sprzetowego!" << endl; return false; } else { dane[ i ] = zmienna; } i++; } return true; }
void Wyswietl_dane( string dane[] ) { int i = 0; cout << "Dane: " << endl; while( dane[ i ] != "" ) { cout << i + 1 << ". " << dane[ i ] << endl; i++; } }
int main() { string dane[ 500 ], sciezka = "tekst.txt"; if( Wczytaj_co_sie_da( dane, sciezka ) == true ) { Wyswietl_dane( dane ); } return 0; }
|
|
Monika90 |
» 2015-05-15 23:00:46 za bardzo kombinujesz int x; while( plik >> x ) { dane[ i++ ] = x; }
if( plik.bad() ) cout << "bardzo źle\n"; else if( plik.eof() ) cout << "OK\n"; else cout << "zły format danych\n";
|
|
Huxyf Temat założony przez niniejszego użytkownika |
» 2015-05-16 09:49:46 Monika90 - Dzięki za pomoc, ale mam do Ciebie 1 pytanie odnośnie twojego kodu. Co zwraca plik >> x w pętli while( plik >> x ) ? Dopóki wczytanie się powiodło wykonuj pętle, a jeżeli nie to zakończ pętle i przejdź do sprawdzenia, co dokładnie spowodowało błąd. Dobrze myślę? |
|
Monika90 |
» 2015-05-16 11:53:42 W uproszczeniu: wyrażenie przyjmuje wartość true gdy operatorowi >> udało się wczytać coś z pliku do zmiennej x, a jeżeli się nie udało bo format lub zakres był nieprawidłowy, albo plik się skończył, to przyjmuje wartość false. Ale to jest uproszczenie. Tak naprawdę, wyrażenie plik >> x nie jest typu bool, jego typ to std::istream, ale wartości typu istream są w pewnych kontekstach automatycznie konwertowane na wartości typu bool. Dopóki wczytanie się powiodło wykonuj pętle, a jeżeli nie to zakończ pętle i przejdź do sprawdzenia, co dokładnie spowodowało błąd. Dobrze myślę? |
Tak. |
|
Huxyf Temat założony przez niniejszego użytkownika |
» 2015-05-16 14:24:01 Monika90 - Wielkie dzięki. |
|
« 1 » |