Lekcja 34 - wczytywanie liczb z pliku
Ostatnio zmodyfikowano 2018-12-06 21:44
marcinpro Temat założony przez niniejszego użytkownika |
Lekcja 34 - wczytywanie liczb z pliku » 2018-02-11 21:54:58 Rozwiązywałem zadanie z lekcji 34. "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)." Nie rozumie co robi tutaj linijka getline(plik, linie); Bo program nie działał mi prawidłowo jak miałem zamiast tego plik.get(); dobrze liczył gdzie sa linie, ale zliczał mi drugi wiersz. Poszukałem porad i znalazłem podobny tylko z getline. Poprostu zapisuje taki spam do zmiennej string jak był bład? #include <string> #include <iostream> #include <fstream>
using namespace std;
bool czy( 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; } }
void odczytwierszy( ifstream & plik ) { string linie; int wiersz = 1; int liczba = 0; int suma = 0; plik.clear(); while( !plik.eof() ) { plik >> liczba; suma += liczba; if( plik.fail() ) { cout << "Napotkano blad w wierszu nr." << wiersz << endl; plik.clear(); getline( plik, linie ); suma = 0; } else { if( czy( plik ) ) { cout << suma << endl; wiersz++; suma = 0; } } } }
void odczytajplik( string nazwa ) { ifstream plik; plik.open( nazwa.c_str() ); if( !plik.good() ) { cout << "Nie udalo sie wczytac pliku!" << endl; } else { cout << "Plik wczytano poprawenie!" << endl; odczytwierszy( plik ); } }
int main()
{ odczytajplik( "c:\\2zad34.txt" ); return 0; } [ cpp ] |
|
YooSy |
» 2018-02-12 07:40:24 Funkcja getline doczytuje dane do końca wiersza od miejsca wystąpienia błędu odczytu danych. Nigdzie więcej program nie używa zmiennej linie. Zamiast dodatkowej zmiennej i funkcji getline można użyć ignore dla strumienia plikowego. |
|
rosa |
» 2018-12-06 16:38:27 YooSy, zamienilem getline na plik.ignore i teraz program wyswietla mi dodatkowo znak "5" ktory znajduje sie na koncu niepoprawnego wiersza, przy getlinie program dziala dobrze tyle ze tak jak zostalo wpsomniane wyzej, nie jest to nigdzie uzywana zmienna "linie", ona tylko przechowuje dane po błędzie, |
|
YooSy |
» 2018-12-06 18:51:54 Pokaż kod. |
|
rosa |
» 2018-12-06 19:24:46 #include "pch.h" #include <string> #include <iostream> #include <fstream>
using namespace std;
bool czy( 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; } }
void odczytwierszy( ifstream & plik ) { string linie; int wiersz = 1; int liczba = 0; int suma = 0; plik.clear(); while( !plik.eof() ) { plik >> liczba; suma += liczba; if( plik.fail() ) { cout << "Napotkano blad w wierszu nr." << wiersz << endl; plik.clear(); plik.ignore(); suma = 0; } else { if( czy( plik ) ) { cout << suma << endl; wiersz++; suma = 0; } } } }
void odczytajplik( string nazwa ) { ifstream plik; plik.open( nazwa.c_str() ); if( !plik.good() ) { cout << "Nie udalo sie wczytac pliku!" << endl; } else { cout << "Plik wczytano poprawenie!" << endl; odczytwierszy( plik ); } }
int main()
{ odczytajplik( "c:\\2zad34.txt" ); return 0; }
|
|
pekfos |
» 2018-12-06 19:27:53 |
|
rosa |
» 2018-12-06 19:47:55 problem polega na tym ze z plik.ignore() program dziala ale wyswietla mi się ostatni znak z drugiego wiersza z pliku tekstowego i nie jest to poprawne działanie, natomiast z getline(plik, linie) ten znak sie nie wyswietla i cały program dziala dobrze, zadanie drugie zostaje rozwiazane poprawnie pomimo tego ze zmienna string linie nie jest nigdzie uzywana tylke w niej sa zapisane smieci. |
|
pekfos |
» 2018-12-06 19:53:31 |
|
« 1 » 2 |