Lekcja 34 Zadanie 2.
Ostatnio zmodyfikowano 2014-07-07 20:14
Haryen Temat założony przez niniejszego użytkownika |
Lekcja 34 Zadanie 2. » 2014-07-07 15:46:11 Cześć! Mam problem z zadaniem domowym z lekcji 34. Wszystko działa dobrze, ale źle wczytuje jedną linię. Plik do wczytania: 1 2 3 3 4 a 5 3 2 5 2 2 1 3 # 3 4
Problem pojawia się w linii "3 4 a 5". Prawidłowo pokazuje, że są błędne dane jednak przy następnym obiegu pętli wczytuje 5 z tej samej linii czego wynikiem jest: 6 Bledne dane w wierszu nr 2! 5 5 13 Bledne dane w wierszu nr 5!
A powinno być: 6 Bledne dane w wierszu nr 2! 5 13 Bledne dane w wierszu nr 5!
Kod:
#include <iostream> #include <fstream> #include <string>
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 odczytajPlik( std::string sNazwaPliku ) { std::ifstream plik; plik.open( sNazwaPliku.c_str() ); if( !plik.good() ) return false; int liczba, suma = 0, wiersz = 1; while( !plik.eof() ) { plik >> liczba; if( plik.fail() ) { std::cout << "Bledne dane w wierszu " << wiersz << "!" << std::endl; if( plik.fail() && !( czyNapotkanoZnakNowegoWiersza( plik ) ) ) suma = 0; plik.clear(); plik.get(); continue; } else { suma += liczba; if( czyNapotkanoZnakNowegoWiersza( plik ) ) { wiersz++; std::cout << suma << std::endl; suma = 0; } } } return true; }
int main() { if( !odczytajPlik( "plik.txt" ) ) std::cout << "Nie udalo sie odczytac pliku!" << std::endl; return 0; }
Jak to naprawić? |
|
pekfos |
» 2014-07-07 17:27:51 ignore(), albo getline(). |
|
Haryen Temat założony przez niniejszego użytkownika |
» 2014-07-07 17:49:55 Ok, ale gdzie to umieścić? Kiedy robię tak to nie działa, bo rozpoczyna się kolejny obieg pętli, więc i tak to wczytuje: #include <iostream> #include <fstream> #include <string>
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 odczytajPlik( std::string sNazwaPliku ) { std::ifstream plik; plik.open( sNazwaPliku.c_str() ); if( !plik.good() ) return false; int liczba, suma = 0, wiersz = 1; while( !plik.eof() ) { plik >> liczba; if( plik.fail() ) { std::cout << "Bledne dane w wierszu " << wiersz << "!" << std::endl; suma = 0; if( !czyNapotkanoZnakNowegoWiersza( plik ) ) std::cin.ignore(); plik.clear(); plik.get(); } else { suma += liczba; if( czyNapotkanoZnakNowegoWiersza( plik ) ) { wiersz++; std::cout << suma << std::endl; suma = 0; } } } return true; }
int main() { if( !odczytajPlik( "plik.txt" ) ) std::cout << "Nie udalo sie odczytac pliku!" << std::endl; return 0; }
Ten sposób z getline() działa: #include <iostream> #include <fstream> #include <string>
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 odczytajPlik( std::string sNazwaPliku ) { std::ifstream plik; plik.open( sNazwaPliku.c_str() ); if( !plik.good() ) return false; int liczba, suma = 0, wiersz = 1; std::string linia; while( !plik.eof() ) { plik >> liczba; if( plik.fail() ) { suma = 0; std::cout << "Bledne dane w wierszu " << wiersz << "!" << std::endl; plik.clear(); std::getline( plik, linia ); wiersz++; } else { suma += liczba; if( czyNapotkanoZnakNowegoWiersza( plik ) ) { wiersz++; std::cout << suma << std::endl; suma = 0; } } } plik.close(); return true; }
int main() { if( !odczytajPlik( "plik.txt" ) ) std::cout << "Nie udalo sie odczytac pliku!" << std::endl; return 0; }
|
|
pekfos |
» 2014-07-07 20:05:47 |
|
Haryen Temat założony przez niniejszego użytkownika |
» 2014-07-07 20:14:43 Dobra, dzięki. Ten paragraf pominąłem, bo myślałem, że dotyczy tylko Linuksa. :) |
|
« 1 » |