Lekcja 34 - Drugie zadanie domowe
Ostatnio zmodyfikowano 2016-10-07 23:20
Koperek Temat założony przez niniejszego użytkownika |
Lekcja 34 - Drugie zadanie domowe » 2016-10-07 22:35:49 Zadanie brzmi: Napisz program, który dla każdego wiersza w pliku: wczyta liczby i wypisze ich sumę w przypadku, gdy wszystkie liczby uda się wczytać; wypisze komunikat o błędnych danych, jeżeli wystąpi błąd podczas wczytywania liczb (komunikat ma wyświetlać numer wiersza, w którym wystąpił błąd). Przykładowe dane: 1 2 3 3 4 a 5 3 2 5 2 2 1 3 # 3 4 Funkcji "czyNapotkanoZnakNowegoWiersza" nie można modyfikować. Program działa jak należy, aż do ostatniej linijki gdzie nie może wyjść z pętli "while (!czyNapotkanoZnakNowegoWiersza(plik))". Debug pokazuje że po przejściu do ostatniego wiersza, pętla ta zostaje wykonana 2 razy, a potem odnawia się po słowie kluczowym continue. Nie potrafię znaleźć przyczyny błędu. #include <iostream> #include <string> #include <fstream> 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 wczytajPlik( string nazwaPliku ) { ifstream plik; plik.open( nazwaPliku ); if( !plik.good() ) return false; int i = 0; while( !plik.eof() ) { char bFlagaFail = false; int a = 0; int suma = 0; while( !czyNapotkanoZnakNowegoWiersza( plik ) ) { plik >> a; if( plik.fail() ) { plik.clear(); plik.get(); bFlagaFail = true; continue; } cout << "DEBUG "; suma += a; } i++; if( bFlagaFail == true ) { cout << "BLAD W LINIJCE NR. " << i << endl; continue; } else cout << suma << endl; } return true; }
int main() { if( !wczytajPlik( "text.txt" ) ) cout << "BLAD"; system( "pause" ); return 0; }
|
|
mateczek |
» 2016-10-07 23:20:08 do szukania błędów zapoznaj się z debugerem . A do tego problemu fajnie nadaje się z klasa stringstrem #include <fstream> #include<iostream> #include<sstream> using namespace std; int main() { ifstream plik( "plik.txt" ); if( !plik ) { cout << "brak pliku o takiej nazwie "; return 0; } string linijka; while( getline( plik, linijka ) ) { stringstream ss( linijka ); int suma = 0, liczba; while( ss >> liczba ) suma += liczba; if( !ss.eof() ) cout << "blad tam były inne znaki" << endl; else cout << "suma= " << suma << endl; } } |
|
« 1 » |