Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Nieskonczona petla w funkcji zwracajacej boola.

Ostatnio zmodyfikowano 2015-07-04 20:01
Autor Wiadomość
Unique511
Temat założony przez niniejszego użytkownika
Nieskonczona petla w funkcji zwracajacej boola.
» 2015-07-04 19:47:32
C/C++
bool czyNapotkanoZnakNowegoWiersza( std::ifstream & plik )
{
    char cZnak;
    for(;; ) //nieskończona pętla
    {
        plik.clear();
        cZnak = plik.peek(); //sprawdzamy jaki kolejny znak zostanie zwrócony przez operację odczytu
        if( plik.fail() || plik.bad() )
             return false; //wystąpił błąd odczytu danych
       
        if( !isspace( cZnak ) )
             return false; //pobrany znak nie jest białym znakiem
       
        plik.get( cZnak ); //odczytujemy biały znak z pliku
        if( plik.fail() || plik.bad() )
             return false; //wystąpił błąd odczytu danych
       
        if( cZnak == '\n' )
             return true;
       
    } //for
}

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).

C/C++
#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;
}
P-134316
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ć.
P-134317
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.
P-134319
« 1 »
  Strona 1 z 1