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

Odczyt danych z pliku (.txt)

Ostatnio zmodyfikowano 2015-05-16 14:24
Autor Wiadomość
Huxyf
Temat założony przez niniejszego użytkownika
Odczyt danych z pliku (.txt)
» 2015-05-15 22:14:58
Witam,

Pomimo, iż wykorzystałem wszelkie zabezpieczenia omawiane w ostatnich lekcjach tutejszego kursu, program nie radzi sobie z pustym wierszem na końcu pliku. Mówiąc bardziej konkretnie to flaga metody
fail()
 zamyka program.

Proszę o wskazówki jak temu zapobiec.

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

using namespace std;

bool Wczytaj_co_sie_da( string dane[], string sciezka )
{
    int i = 0;
    string 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 false;
    }
    // Dopoki ostatni odczyt cin / getline nie okaze sie koñcem pliku
    while( !plik.eof() )
    {
        plik >> zmienna;
        // Je¿eli ostatni odczyt cin / getline zakoñczyl sie fiaskiem przez inny typ danych
        if(( !plik.bad() ) &&( plik.fail() == true ) )
        {
            cout << "Nieudana proba odczytu danych z powodu innego typu danych!" << endl;
            // cout << i << ". " << plik.bad() << " , " << plik.fail() << endl; // sprawdzanie flag
            return false;
        }
        // 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 false;
        }
        else
        {
            dane[ i ] = zmienna;
        }
        i++;
    }
    return true;
   
}

void Wyswietl_dane( string dane[] )
{
    int i = 0;
    cout << "Dane: " << endl;
    while( dane[ i ] != "" )
    {
        cout << i + 1 << ". " << dane[ i ] << endl;
        i++;
    }
}

int main()
{
    string dane[ 500 ], sciezka = "tekst.txt";
    if( Wczytaj_co_sie_da( dane, sciezka ) == true )
    {
        Wyswietl_dane( dane );
    }
    return 0;
}
P-132320
Monika90
» 2015-05-15 23:00:46
za bardzo kombinujesz

C/C++
int x;
while( plik >> x )
{
    dane[ i++ ] = x;
}

if( plik.bad() )
     cout << "bardzo źle\n";
else if( plik.eof() )
     cout << "OK\n";
else
     cout << "zły format danych\n";

P-132324
Huxyf
Temat założony przez niniejszego użytkownika
» 2015-05-16 09:49:46
Monika90 - Dzięki za pomoc, ale mam do Ciebie 1 pytanie odnośnie twojego kodu. Co zwraca
plik >> x
 w pętli
while( plik >> x )
? Dopóki wczytanie się powiodło wykonuj pętle, a jeżeli nie to zakończ pętle i przejdź do sprawdzenia, co dokładnie spowodowało błąd. Dobrze myślę?
P-132332
Monika90
» 2015-05-16 11:53:42
Co zwraca plik >> x
W uproszczeniu: wyrażenie przyjmuje wartość true gdy operatorowi >> udało się wczytać coś z pliku do zmiennej x,
a jeżeli się nie udało bo format lub zakres był nieprawidłowy, albo plik się skończył, to przyjmuje wartość false.

Ale to jest uproszczenie. Tak naprawdę, wyrażenie plik >> x nie jest typu bool, jego typ to std::istream, ale wartości typu istream są  w pewnych kontekstach automatycznie konwertowane na wartości typu bool.

Dopóki wczytanie się powiodło wykonuj pętle, a jeżeli nie to zakończ pętle i przejdź do sprawdzenia, co dokładnie spowodowało błąd. Dobrze myślę?
Tak.
P-132336
Huxyf
Temat założony przez niniejszego użytkownika
» 2015-05-16 14:24:01
Monika90 - Wielkie dzięki.
P-132342
« 1 »
  Strona 1 z 1