Nieskonczona petla w funkcji zwracajacej boola.
Ostatnio zmodyfikowano 2015-07-04 20:01
Unique511 Temat założony przez niniejszego użytkownika |
Nieskonczona petla w funkcji zwracajacej boola. » 2015-07-04 19:47:32 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; } } Jest to zadanie z przedostatniej lekcji 4 rozdziału kursu C++. Nie mogę zrozumieć po co tutaj nieskoczona petla i czemu nie dziala bez niej program ktory napisalem. W moim rozumowaniu petla i tak wykona sie raz poniewaz w kazdym warunku jest return wiec petla sie przerwie i funkcja skonczy. Czy moze zle rozumuje? Tutaj caly kod jakby ktos chcial: (prosze o wytlumaczenie tylko nieskonczonej petli, reszta potencjalnych bledow mnie nie interesuje). #include <cstdio> #include <iostream> #include <string> #include <ctime> #include <cstdlib> #include <fstream> using namespace std;
ifstream plik; bool wiersz = true; int iNumerWiersza = 1; int iWynik;
bool czyNatrafionoNaKoniecWiersza( ifstream & plik ) { char cZnak; while( true ) { plik.clear(); cZnak = plik.peek(); if( plik.bad() || plik.fail() ) { return false; } if( !isspace( cZnak ) ) { return false; } plik.get( cZnak ); if( plik.bad() || plik.fail() ) { return false; } if( cZnak == '\n' ) { return true; } } }
bool wczytajZnak( ifstream & plik ) { char cZnak; plik.clear(); plik >> cZnak; if( plik.bad() ) { plik.close(); return false; } if( plik.fail() ) { return false; } return true; }
bool wczytajLiczbe( ifstream & plik ) { int iLiczba; plik.clear(); plik >> iLiczba; if( plik.bad() ) { plik.close(); return false; } if( plik.fail() ) { if( !wczytajZnak( plik ) ) { plik.close(); return false; } wiersz = false; cout << "Blad w wierszu numer " << iNumerWiersza << "." << endl; } else { iWynik += iLiczba; } return true; }
bool wczytajPlik( string nazwa ) { plik.open( nazwa.c_str() ); if( plik.bad() ) { plik.close(); return false; } while( !plik.eof() ) { if( czyNatrafionoNaKoniecWiersza( plik ) ) { if( wiersz ) { cout << iWynik << endl; } wiersz = true; iWynik = 0; ++iNumerWiersza; } if( !wczytajLiczbe( plik ) && plik.bad() ) { return false; } } plik.close(); return true; }
int main() { if( !wczytajPlik( "C:/pliczek.txt" ) ) { cout << "Nie udalo sie wczytac pliku." << endl; } else { cout << "Plik zostal pomyslnie wczytany." << endl; } return 0; } |
|
pekfos |
» 2015-07-04 19:55:55 i tak wykona sie raz poniewaz w kazdym warunku jest return wiec petla sie przerwie i funkcja skonczy |
Warunki mają to do siebie, że nie muszą się zawsze wykonywać. |
|
Unique511 Temat założony przez niniejszego użytkownika |
» 2015-07-04 20:01:26 Rzeczywiście, właśnie zauwazylem, ze wystarczy zastapic petle while(true) czy tam nieskonczonego fora zwyklym return false; na koniec funkcji :D. Dzieki za pomoc, czasem glupiej rzeczy czlowiek nie zauwaza. |
|
« 1 » |