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

Pomijanie ostatniego wersu w pliku do odczytu

Ostatnio zmodyfikowano 2017-02-28 19:41
Autor Wiadomość
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:
C/C++
#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"
P-158362
Bielan
» 2017-02-28 18:34:58
Poczytaj o tym jak dokładnie działa metoda good. Co zwraca i kiedy:
» Kurs C++ » Poziom 1Obsługa strumienia wejściowego lekcja

Oraz w kontekście wczytywania pliku:
» Kurs C++Obsługa plików lekcja

Flaga 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ć?
P-158364
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:
C/C++
while( true )
{
    int a;
    int b;
    int c;
    plik >> a >> b >> c;
    wykonajOperacje( a, b, c );
    if( !plik.good() )
         break;
   
}
P-158366
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".
P-158368
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.
P-158384
« 1 »
  Strona 1 z 1