Rozdział 32 - Odczytywanie tekstu z pliku
Ostatnio zmodyfikowano 2016-01-24 12:52
Monika90 |
» 2016-01-24 11:00:40 funkcja getline ciut różni się w nowym standardzie c++11. |
To nie ona jest winna, tylko zastąpienie operator void* przez explicit operator bool w nowym standardzie ( http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool). Więc jeżeli chcesz wczytać zawartość pliku linia po linii, to robisz to tak string line; while( getline( file, line ) ) { cout << line << endl; }
|
albo tak for( string line; getline( file, line ); ) { cout << line << endl; }
ten drugi sposób jest wg mnie gorszy, to jest nadużycie pętli for, ale niektórzy tak piszą. Kody te są równoważne tym string line; while( !getline( file, line ).fail() ) { cout << line << endl; }
for( string line; !getline( file, line ).fail(); ) { cout << line << endl; }
Bo poprawność wczytania należy sprawdzać za pomocą !fail(), a nie za pomocą good(). getline zwraca referencję do strumienia, a użycie strumienia jako warunku if czy while, jest równoważne użyciu zanegowanego wyniku wywołania funkcji fail() na tym strumieniu. Kod z kursu można dostosować do współczesnego standardu w taki sposób string wiersz; for( bool bWczytano = !getline( plik, wiersz ).fail(); bWczytano; bWczytano = !getline( plik, wiersz ).fail() ) cout << wiersz << endl;
albo w taki string wiersz; for( bool bWczytano = bool( getline( plik, wiersz ) ); bWczytano; bWczytano = bool( getline( plik, wiersz ) ) ) cout << wiersz << endl;
albo w taki string wiersz; for( bool bWczytano = !!getline( plik, wiersz ); bWczytano; bWczytano = !!getline( plik, wiersz ) ) cout << wiersz << endl;
Tylko po co tak kombinować? Co trzeba zrobić, by w pętli znów wypisywało od pierwszej?
|
Musisz się cofnąć na początek pliku jak to nie zadziała to tak file.clear(); file.seekg( 0 );
|
|
mateczek |
» 2016-01-24 12:52:57 Dzięki za wyjaśnienia :). Ja nie ukrywam że moja znajomość c++ to trochę czytania trochę przykładów i jak widać nie zawsze wiadomo co z czym do końca ugryźć |
|
1 « 2 » |