Lich555 Temat założony przez niniejszego użytkownika |
Rozdział 32 - Odczytywanie tekstu z pliku » 2016-01-22 19:57:26 Witam. string wiersz; for( bool bWczytano = getline( plik, wiersz ); bWczytano; bWczytano = getline( plik, wiersz ) ) cout << wiersz << endl;
Tworzymy zmienną bool bWczytano której nadajemy wartość getline (plik, wiersz). Czyli jak uda się odczytać tekst z pliku to jest 1, a jak się nie uda to 0, tak? Po średniku jest bWczytano. Czyli że pętla wykonuje się dopóty, dopóki bWczytano=1 (czyli dopóki jest co wypisywać?). Średnik. Po każdej wypisanej linijce z pliku (czyli po każdorazowym wykonaniu się pętli), bWczytano = getline (plik, wiersz). Ciężko mi sobie wyobrazić co to ostatnie oznacza. To, że bWczytano = getline (plik, wiersz). Mam nadzieję, że uda Wam się to jakoś łatwo mi wytłumaczyć, bo nie ruszę inaczej z materiałem. @Edit Nie rozumiem też czemu nie wczytuje mi to 1 linijki z pliku. Mój kod: http://i.imgur.com/E7Wcn1R.png |
|
mateczek |
» 2016-01-22 21:12:50 #include <iostream> #include<string> #include<fstream> using namespace std;
int main() { string linia; fstream plik; plik.open( "/home/tygrysy/test", ios_base::in ); if( !plik.good() ) { cout << "error" << endl; return 0; } while( getline( plik, linia ) ) cout << linia << endl; plik.close(); }
twój kod mi się nawet nie kompiluje z racji tego, że getline nie zwraca bool !!!! z for pętla może wyglądać tak for(; plik; getline( plik, linia ) ) cout << linia << endl; |
|
Lich555 Temat założony przez niniejszego użytkownika |
» 2016-01-23 10:35:37 1.Prosiłem o wytłumaczenie, a nie "jak to może wyglądać". 2.Nie kompiluje Ci? Z tego co widzę to mój program jest taki sam jak w przykładzie w poradniku.
My tworzymy nieskończoną pętlę, która tak jakby "inkrementuje" i przechodzi do następnej linijki? |
|
mateczek |
» 2016-01-23 10:50:37 /home/tygrysy/nienazwany/main.cpp:17: błąd: cannot convert 'std::basic_istream<char>' to 'bool' in initialization for( bool bWczytano = getline( plik, linia ); bWczytano; bWczytano = getline( plik, linia ) ) ^
http://zapodaj.net/images/2e43c42b1607e.pnggetline zwraca bodajże referencję do do strumienia i kompilator ma problem z przekonwertowaniem jej do typu bool (nie wiem dlaczego ale u mnie kod się nie kompiluje ) gcc version 5.2.1 20151010 (Ubuntu 5.2.1-22ubuntu2)
dlatego zaproponowałem taką wersję pętli for for( string a = "jestem zbędny"; plik.good(); getline( plik, linia ) ) cout << linia << endl;
1. pierwszy warunek jest zbędny i bez znaczenia co tam wpiszesz !!! byle się skompilowało :P 2. drugi warunek sprawdza czy strumień ma poprawną wartość 3. to operacja odczytu linii ze strumienia |
|
Monika90 |
» 2016-01-23 11:09:22
string wiersz; for( bool bWczytano = getline( plik, wiersz ); bWczytano; bWczytano = getline( plik, wiersz ) ) cout << wiersz << endl;
2.Nie kompiluje Ci? Z tego co widzę to mój program jest taki sam jak w przykładzie w poradniku. |
Kod w poradniku jest błędny, choć był poprawny przed 2011 rokiem. |
|
Lich555 Temat założony przez niniejszego użytkownika |
» 2016-01-23 15:08:16 Moderatorzy mogą to zmienić, coś z tym zrobić? @mateczek Mógłbyś wytłumaczyć warunek kończący, który użyłeś w pętli while post wcześniej? To jest operacja odczytu linii ze strumienia? Mógłbym prosić o jakieś łatwiejsze, bardziej obrazowe wytłumaczenie tego? :P |
|
mateczek |
» 2016-01-23 16:13:22 Moderatorzy mogą to zmienić, coś z tym zrobić |
To trochę moja wina, bo nie wiedziałem (nie zorientowałem się), iż funkcja getline ciut różni się w nowym standardzie c++11. A że mam nowy kompilator, który korzysta z tego standardu to mi wywalił błąd kompilacji. Dlatego pomyślałem, że to ty masz błąd w kodzie !!! Nie wiem czy moje wytłumaczenie będzie w 100% poprawne. Na pewno dużo lepiej by to wyjaśniła Monikia90!!! Ale ja z grubsza widzę to tak: Funkcja getline( plik, linia ) zwraca referencję do strumienia plik. getline( getline( plik, linia ), linia );
więc najpierw wykonywany jest odczyt linijki z pliku i jeśli odczyt się powiedzie i funkcja zwróci cokolwiek większe od 0 to pętla wykona się jeszcze raz!!! możesz ten kod napisać inaczej while( plik.good() ) { getline( plik, linia ); cout << linia << endl; }
getline() zwraca referencję do strumienia plik i pewnie może tą referencję unieważnić!!! Ps. Tak na marginesie to takie coś mi się już skompilowało. for( bool bWczytano = getline( plik, linia ).good(); bWczytano; bWczytano = getline( plik, linia ).good() ) cout << linia << endl; ADD/// dodam jeszcze że tak można obsługiwać wszystkie strumienie #include <iostream> using namespace std;
int main() { int a; while( cin >> a ) cout << a << endl; }
|
|
Lich555 Temat założony przez niniejszego użytkownika |
» 2016-01-23 18:13:03 Ok. Powiem szczerze, że w miarę rozumiem. Dzięki wielkie :) No chyba że Monika90 ma jeszcze jakieś zastrzeżenia lub coś do dodania, to prosiłbym by to zrobiła :P @mateczek Użyłem metody while (plik.good()) itd. ale to mi wczytuje od drugiej linijki. Jest to ten sam program co jest w linku w powyższych postach. 1 linijka była wypisana już wcześniej. Co trzeba zrobić, by w pętli znów wypisywało od pierwszej? Trzeba plik.close(), a potem jak korzystam z niego w pętli to znów muszę plik.open? I tak za każdym razem? @Edit Chyba nawet to nie działa. |
|
« 1 » 2 |