Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Rozdział 32 - Odczytywanie tekstu z pliku

Ostatnio zmodyfikowano 2016-01-24 12:52
Autor Wiadomość
Lich555
Temat założony przez niniejszego użytkownika
Rozdział 32 - Odczytywanie tekstu z pliku
» 2016-01-22 19:57:26
Witam.
C/C++
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
P-143898
mateczek
» 2016-01-22 21:12:50
C/C++
#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
C/C++
for(; plik; getline( plik, linia ) )
     cout << linia << endl;
P-143900
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?
P-143905
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.png

getline 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

C/C++
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
P-143906
Monika90
» 2016-01-23 11:09:22

C/C++
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.
P-143907
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
P-143918
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.
C/C++
getline( getline( plik, linia ), linia ); // przez co takie wywołanie się skompiluje


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

C/C++
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.
C/C++
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
C/C++
#include <iostream>
using namespace std;


int main()
{
    int a;
    while( cin >> a ) cout << a << endl; // dopuki podajesz cyfrę prosi Cię o nową
   
}
P-143921
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.
P-143925
« 1 » 2
  Strona 1 z 2 Następna strona