[C++] Wyswietlanie prawidlowego nr wiersza
Ostatnio zmodyfikowano 2017-07-06 08:19
kombatdavid123 Temat założony przez niniejszego użytkownika |
[C++] Wyswietlanie prawidlowego nr wiersza » 2017-07-05 18:01:22 Witam, otóż udało mi się zrealizować "trudne" zadanie z Kursu z kontroli błędów, z wyjątkiem jednego szczegółu. Program działa poprawnie natomiast w ostatnim wierszu konsoli wyswietla "Błędne dane w wierszu 4!" zamiast w wierszu 5. Nie rozumiem tego bo przecież informacje o błędzie w wierszu drugim wyświetlane są poprawnie. #include <iostream> #include <fstream> #include <string> #include <windows.h>
using namespace std;
bool czyNapotkanoZnakNowegoWiersza( ifstream & plik );
bool WCZYTAJ_LICZBE( ifstream & PLIK, int & LICZBA );
bool WCZYTAJ_ZNAK( ifstream & PLIK, char & ZNAK );
bool WCZYTAJ_PLIK( string NAZWA_PLIKU );
int main() { if( WCZYTAJ_PLIK( "dane.txt" ) ) cout << "Udalo sie otworzyc plik !" << endl; return 0; }
bool WCZYTAJ_LICZBE( ifstream & PLIK, int & LICZBA ) { PLIK.clear(); PLIK >> LICZBA; if( PLIK.bad() ) return false; if( PLIK.fail() ) return false; return true; }
bool WCZYTAJ_ZNAK( ifstream & PLIK, char & ZNAK ) { PLIK.clear(); PLIK >> ZNAK; if( PLIK.bad() ) return false; if( PLIK.fail() ) return false; return true; }
bool czyNapotkanoZnakNowegoWiersza( 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 WCZYTAJ_PLIK( string NAZWA_PLIKU ) { ifstream PLIK; PLIK.open( NAZWA_PLIKU.c_str() ); if( !PLIK.good() ) return false; int wiersz = 1; int liczba; int suma = 0; char znak; while( !PLIK.eof() ) { if( WCZYTAJ_LICZBE( PLIK, liczba ) ) { suma += liczba; } else if( WCZYTAJ_ZNAK( PLIK, znak ) ) { suma = 0; cout << "Bledne dane w wierszu nr " << wiersz << "!" << endl; } if( czyNapotkanoZnakNowegoWiersza( PLIK ) ) { wiersz++; cout << suma << endl; suma = 0; } } return true; } PS: Użyłem tych samych danych, które były użyte w kursie Z góry dziękuje za jakąkolwiek wskazówkę |
|
darko202 |
» 2017-07-06 08:19:27 Twój program nie jest dobry, ponieważ masz trzy funkcje które czytają znak z pliku, a w każdej czytasz znak z pliku. Jeśli przeczytasz coś z pliku to przesuwa się miejsca czytania w pliku. Kolejna funkcja czyta od nowego miejsca, dlatego funkcja czyNapotkanoZnakNowegoWiersza nie sprawdza wszystkich znaków nowej linii. błędem jest, że oczekujesz od pliku, aby miał określona strukturę, a to program powinien rozstrzygnąć jaki ciąg znak został wczytany. logika programu powinna być inna 1. czyta ciąg znaków ( np. get ) 2. rozstrzyga co to za ciąg znaków 3. sprawdza czy jest zgodność z oczekiwaną struktura pliku .... przeczytaj i wykorzysta funkcje konwertujące znaki np. atoi, itoa ..... http://cpp0x.pl/dokumentacja/standard-C/Konwersja-na-liczbe/237 |
|
« 1 » |