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

Metoda eof() nie ustawia flagi, pomimo końca pliku.

Ostatnio zmodyfikowano 2015-05-16 17:01
Autor Wiadomość
Huxyf
Temat założony przez niniejszego użytkownika
Metoda eof() nie ustawia flagi, pomimo końca pliku.
» 2015-05-16 15:20:58
Witam,

Dlaczego metoda
eof()
 nie ustawia flagi na true, pomimo końca pliku?

C/C++
#include <iostream>
#include <string>
#include <fstream>

using namespace std;

void Wczytaj_co_sie_da( long long dane[], string bledy[], string sciezka, int & dlugosc )
{
    long long zmienna;
    ifstream plik;
    plik.open( sciezka.c_str() );
    // Je¿eli proba otwarcia pliku sie niepowiodla
    if( !plik.good() )
    {
        cout << "Brak dostepu do pliku!" << endl;
        return;
       
    }
   
    for(;; )
    {
        while( plik >> zmienna )
        {
            dane[ dlugosc ] = zmienna;
            dlugosc++;
        }
        // Jeżeli ostatni odczyt cin / getline nie okaze sie koñcem pliku
        if( plik.eof() )
        {
            cout << "Odczytywanie danych z pliku " << sciezka << " przebieglo pomyslnie!" << endl;
            plik.close();
            return;
        }
        // Je¿eli ostatni odczyt cin / getline zakoñczyl sie fiaskiem przez inny typ danych
        else if(( !plik.bad() ) &&( plik.fail() == true ) )
        {
            plik >> bledy[ dlugosc ];
            plik.clear();
            dlugosc++;
        }
        // Je¿eli ostatni odczyt cin / getline zakoñczyl sie fiaskiem przez blad sprzetowy
        else if(( plik.bad() == true ) &&( plik.fail() == true ) )
        {
            cout << "Nieudana proba odczytu danych z powodu bledu sprzetowego!" << endl;
            return;
        }
    }
}

void Wyswietl_dane( long long dane[], string bledy[], int dlugosc )
{
    cout << endl << "Dane: " << endl;
    for( int i = 0; i < dlugosc; i++ )
    {
        if( bledy[ i ] != "" )
        {
            cout << i + 1 << ". Nieudana proba odczytu liczby z powodu innego typu danych\"";
            cout << bledy[ i ] << "\"!" << endl;
            continue;
        }
        cout << i + 1 << ". " << dane[ i ] << endl;
    }
}

int main()
{
    int dlugosc = 0;
    long long dane[ 500 ];
    string bledy[ 500 ], sciezka = "tekst.txt";
    Wczytaj_co_sie_da( dane, bledy, sciezka, dlugosc );
    if( dlugosc > 0 )
    {
        Wyswietl_dane( dane, bledy, dlugosc );
    }
    return 0;
}
P-132344
Monika90
» 2015-05-16 16:19:44
plik.clear();
 powinno być przed
plik >> bledy[ dlugosc ];

Gdy strumień jest w stanie błędu, to operacje wejścia/wyjścia nie działają.
P-132352
Huxyf
Temat założony przez niniejszego użytkownika
» 2015-05-16 17:01:06
Monika90 - Po raz kolejny wielkie dzięki. ;) Niby są to takie niuanse, które nawet nie są omawiane w kursie, aczkolwiek potrafią narobić problemów początkującemu programiście.
P-132356
« 1 »
  Strona 1 z 1