Lekcja 34 Poziom 4 - Błąd przy próbie wczytania litery.
Ostatnio zmodyfikowano 2014-01-04 12:56
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? #include <iostream> #include <fstream> #include <string> using namespace std;
bool czyNapotkanoZnakNowegoWiersza( std::ifstream & plik ) { char cZnak; for(;; ) { plik.clear(); cZnak = plik.peek(); if( plik.fail() || plik.bad() ) return false; if( !isspace( cZnak ) ) return false; plik.get( cZnak ); if( plik.fail() || plik.bad() ) return false; if( cZnak == '\n' ) return true; } }
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() ) { cout << "Bledne dane w wierszu nr " << Wiersz << "!" << endl; plik.clear(); getline( plik, Smietnik ); Wiersz++; Wynik = 0; break; } else { if( !czyNapotkanoZnakNowegoWiersza( plik ) ) { Wynik = Wynik + Liczba; } else { cout << "Wynik w wierszu " << Wiersz << " = " << Wynik + Liczba << endl; Wiersz++; Wynik = 0; } } } 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 |
|
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. |
|
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. if( plik.fail() ) { cout << "Bledne dane w wierszu nr " << Wiersz << "!" << endl; plik.clear(); getline( plik, Smietnik ); Wiersz++; Wynik = 0; }
|
|
« 1 » |