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

Lekcja 34 Poziom 4 - Błąd przy próbie wczytania litery.

Ostatnio zmodyfikowano 2014-01-04 12:56
Autor Wiadomość
Fertood
Temat założony przez niniejszego użytkownika
Lekcja 34 Poziom 4 - Błąd przy próbie wczytania litery.
» 2014-01-04 02:13:07
Witam mam problem z którym głowię się już trochę czasu.

Błąd leży w miejscu sprawdzającym czy wczytywanie liczby powiodło się.
Po napotkaniu litery miał być wyświetlany komunikat, w którym wierszu ów błąd się znajduje (działa), lecz po napotkaniu błędu program się kończy po break.
I tu chciałem ominąć dany wiersz funkcją getline(), aby kontynuować odczytywanie w kolejnych linijkach.
Próbowałem także sposobu, w którym program przypisywałby literę do zmiennej typu char.
Niestety program kończy się w tym momencie za każdym razem.

Gdzie leży więc błąd?

C/C++
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

bool czyNapotkanoZnakNowegoWiersza( std::ifstream & plik )
{
    char cZnak;
    for(;; ) //nieskonczona petla
    {
        plik.clear();
        cZnak = plik.peek(); //sprawdzamy jaki kolejny znak zostanie zwrócony przez operacjê odczytu
        if( plik.fail() || plik.bad() )
             return false; //wystapil blad odczytu danych
       
        if( !isspace( cZnak ) )
             return false; //pobrany znak nie jest bialym znakiem
       
        plik.get( cZnak ); //odczytujemy bialy znak z pliku
        if( plik.fail() || plik.bad() )
             return false; //wystapil blad odczytu danych
       
        if( cZnak == '\n' )
             return true;
       
    } //for
}



bool WczytywanieLiczb( string sNazwaPliku )
{
    ifstream plik;
    plik.open( sNazwaPliku.c_str() );
   
    if( plik.bad() ) return false;
   
    int Wiersz = 1;
    int Liczba;
    int Wynik = 0;
    string Smietnik;
   
    while( !plik.eof() )
    {
       
        plik >> Liczba;
       
        if( plik.fail() ) // Bład w tym IF
        {
            cout << "Bledne dane w wierszu nr " << Wiersz << "!" << endl;
            plik.clear();
            getline( plik, Smietnik );
            Wiersz++;
            Wynik = 0;
           
            break;
        }
        else
        {
            if( !czyNapotkanoZnakNowegoWiersza( plik ) )
            {
                Wynik = Wynik + Liczba;
               
            } // if ( !czyNapotkano...
            else
            {
                cout << "Wynik w wierszu " << Wiersz << " = " << Wynik + Liczba << endl;
                Wiersz++;
                Wynik = 0;
            }
           
        } // else ( !czyNapotkano...
       
    }
    plik.close();
   
   
    return true;
}




int main()
{
   
    string NazwaPliku = "dane.txt";
   
    if( !WczytywanieLiczb( NazwaPliku ) )
         cout << "Odczytywanie nie pwiodlo sie";
   
    return 0;
}

Dane wejściowe:

2 2 3
3 c 5 5
x 2
5 2 2 1 3
# 3 4
P-101084
pekfos
» 2014-01-04 12:11:14
lecz po napotkaniu błędu program się kończy po break.
Niestety program kończy się w tym momencie za każdym razem. Gdzie leży więc błąd?
Zapewne w tym, że nie wiesz, co robi break.
P-101094
Fertood
Temat założony przez niniejszego użytkownika
» 2014-01-04 12:56:47
Ehh.. Najwyraźniej tak.
Byłem przekonany, że zakończy ona instrukcję IF, która powtarzała się w nieskończoność. Dopiero po dokładnym ustawieniu kolejnych poleceń całość zadziałała jak powinna.

C/C++
if( plik.fail() )
{
    cout << "Bledne dane w wierszu nr " << Wiersz << "!" << endl;
    plik.clear();
    getline( plik, Smietnik );
    Wiersz++;
    Wynik = 0;
   
    //break; Usunięte
}

P-101095
« 1 »
  Strona 1 z 1