rozdzial/lekcja 34, zadanie nr 2
Ostatnio zmodyfikowano 2022-04-22 20:46
jebackoze Temat założony przez niniejszego użytkownika |
rozdzial/lekcja 34, zadanie nr 2 » 2022-04-21 21:49:21 popelnilem kod (zmodyfikowalem ten z przykladu w lekcji) i dziala, ale czy nie ustrzeglem sie jakiegos bledu? zadanie opisane jako trudne wiec pewnie jakies pulapki byly EDYCJA: chyba jednak popelnilem jakis blad bo nie wczytuje ostatniego wiersza jesli dodam kolejne wiersze z liczbami do pliku tekstowego #include <iostream> #include <fstream> #include <string> #include <limits>
bool czyEnter( std::ifstream & plik ) { char cZnak; for(;; ) { plik.clear(); cZnak = plik.peek(); if( plik.fail() ) return false; if( !isspace( cZnak ) ) return false; plik.get( cZnak ); if( plik.fail() ) return false; if( cZnak == '\n' ) return true; } } bool odczytajPlik( std::string sNazwaPliku ) { std::ifstream plik; plik.open( sNazwaPliku.c_str() ); if( !plik.good() ) { std::cout << "Nie udalo sie otworzyc pliku." << std::endl; return false; } int suma = 0, wiersz = 1; while( true ) { int iLiczba; char cZnak; plik >> iLiczba; if( !plik.fail() ) { suma += iLiczba; if( czyEnter( plik ) ) { std::cout << "suma: " << suma << std::endl; ++wiersz; suma = 0; } } else { if( plik.bad() ) return false; plik.clear(); plik >> cZnak; if( !plik.fail() ) { std::cout << "blad w wierszu nr " << wiersz << std::endl; suma = 0; ++wiersz; plik.clear(); plik.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); } else { if( plik.eof() ) break; return false; } } } std::cout << "Koniec pliku" << std::endl; return true; }
int main() { if( odczytajPlik( "34.2.txt" ) ) std::cout << "Plik zostal poprawnie wczytany!" << std::endl; return 0; }
|
|
pekfos |
» 2022-04-22 17:39:42 Ten kod zakłada pustą linię na końcu pliku. |
|
jebackoze Temat założony przez niniejszego użytkownika |
» 2022-04-22 17:57:00 powinienem cos dopisac, czy raczej zmodyfikowac (rozumiem, ze gdzies w rejonie if( czyEnter( plik ) ) cos mi sie krzaczy)? EDYCJA, chyba mam to (omylkowo wkleilem inna wersje kodu wczesniej): #include <iostream> #include <fstream> #include <string> #include <limits>
bool czyEnter( std::ifstream & plik ) { char cZnak; for(;; ) { plik.clear(); cZnak = plik.peek(); if( plik.fail() ) return false; if( !isspace( cZnak ) ) return false; plik.get( cZnak ); if( plik.fail() ) return false; if( cZnak == '\n' ) return true; } } bool odczytajPlik( std::string sNazwaPliku ) { std::ifstream plik; plik.open( sNazwaPliku.c_str() ); if( !plik.good() ) { std::cout << "Nie udalo sie otworzyc pliku." << std::endl; return false; } int suma = 0, wiersz = 1; while( true ) { int iLiczba; char cZnak; plik >> iLiczba; if( !plik.fail() ) { suma += iLiczba; if( czyEnter( plik ) ) { std::cout << "suma: " << suma << std::endl; ++wiersz; suma = 0; } if( !czyEnter( plik ) && plik.eof() ) std::cout << "suma: " << suma << std::endl; } else { if( plik.bad() ) return false; plik.clear(); plik >> cZnak; if( !plik.fail() ) { std::cout << "blad w wierszu nr " << wiersz << std::endl; suma = 0; ++wiersz; plik.clear(); plik.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); } else { if( plik.eof() ) break; return false; } } } std::cout << "Koniec pliku" << std::endl; return true; }
int main() { if( odczytajPlik( "34.2.txt" ) ) std::cout << "Plik zostal poprawnie wczytany!" << std::endl; return 0; }
|
|
pekfos |
» 2022-04-22 19:04:25 To nie jest poprawne rozwiązanie, bo czyEnter() ma efekty uboczne. 2 razy sprawdzasz zwracaną wartość więc są tam 2 wywołania. Będzie błędnie liczyć linie jeśli masz w pliku sekwencję znaków nowej linii.
W sumie to jeśli dopuszczamy puste linie, trzeba kod bardziej zmodyfikować by liczył je dobrze. |
|
jebackoze Temat założony przez niniejszego użytkownika |
» 2022-04-22 20:46:11 chyba musze tutaj przycupnac na dluzej bo nie mam na razie planu jak uporac sie z sekwencja pustych linii. myslalem, ze ten szablon kodu, ktory jest opisany jako Wykorzystaj poniższą funkcję do wykrywania znaku przejścia do nowej linii zalatwi sprawe |
|
« 1 » |