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

[Rozdział 34] - brak zrozumienia działania jednego z przykładów;

Ostatnio zmodyfikowano 2017-03-23 15:03
Autor Wiadomość
Qabrix
Temat założony przez niniejszego użytkownika
[Rozdział 34] - brak zrozumienia działania jednego z przykładów;
» 2017-03-23 14:44:20
Witam,
rozpoczynam swoją przygodę z nauką języka C++ i jeszcze nie wszystkie mechanizmy jego działania są mi do końca znane.
Dotychczas, większość zadań oraz zrozumienie przykładów z kursu, przy ich analizie, nie sprawiło mi większych problemów. Aczkolwiek przykład z rozdziału 34 kursu, jest dla mnie zagadkowy.

Poniżej wklejam nieprzerobiony kod przykładu:
C/C++
#include <string>
#include <fstream>
#include <iostream>

bool wczytajLiczbe( std::ifstream & plik, int & iLiczba )
{
    plik.clear(); //Wyczyszczenie ewentualnych flag błędów
    plik >> iLiczba;
    if( plik.bad() )
    {
        std::cout << "Wystapil blad sprzetowy!" << std::endl;
        plik.close();
        return false;
    } else
    if( plik.fail() )
    {
        std::cout << "Nie udalo sie wczytac liczby!" << std::endl;
        return false;
    } else
         std::cout << "Liczba = " << iLiczba << std::endl;
   
    return true;
}

bool wczytajZnak( std::ifstream & plik, char & cZnak )
{
    plik.clear(); //Wyczyszczenie ewentualnych flag błędów
    plik >> cZnak;
    if( plik.bad() )
    {
        std::cout << "Wystapil blad sprzetowy!" << std::endl;
        plik.close();
        return false;
    } else
    if( plik.fail() )
    {
        std::cout << "Nie udalo sie wczytac znaku!" << std::endl;
        return false;
    } //if
    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;
    } //if
    while( !plik.eof() )
    {
        int iLiczba;
        char cZnak;
       
        if( !wczytajLiczbe( plik, iLiczba ) && plik.bad() )
             return false; //wczytanie liczby nie powiodło się z powodu błędu sprzętowego
        else
        if( !wczytajZnak( plik, cZnak ) )
        {
            if( plik.bad() )
                 return false; //wczytanie znaku nie powiodło się z powodu błędu sprzętowego
            else
                 break; //nie ma więcej danych w strumieniu (bo jeden znak zawsze powinno się dać odczytać)
           
        } //if
        std::cout << "Napotkany znak = '" << cZnak << "'" << std::endl;
    } //while
    plik.close();
    return true;
}

int main()
{
    if( odczytajPlik( "cpp0x.txt" ) )
         std::cout << "Plik zostal wczytany!" << std::endl;
   
    return 0;
}


pod plikiem cpp0x.txt kryje się treść: "1 d 3 4 5 6 7 8"
gdzie " " oznaczają - początek i koniec pliku.


po odpaleniu programu, w konsoli otrzymuje:

-----------------------------------------------------
Liczba = 1
Napotkany znak = 'd'
Liczba = 3
Napotkany znak = '4'
Liczba = 5
Napotkany znak = '6'
Liczba = 7
Napotkany znak = '8'
Nie udalo sie wczytac liczby!
Nie udalo sie wczytac znaku!
Plik zostal wczytany!

Process returned 0 (0x0)   execution time : 0.049 s
Press any key to continue.
------------------------------------------------------

pytanie jest następujące:
dlaczego gdy program napotka znak 'd' to nie zwraca informacji "Nie udalo sie wczytac liczby!"?

Z góry dziękuję za wyjaśnienie :) Oraz przepraszam jeżeli pytanie wyda się głupie.


P-159265
Qabrix
Temat założony przez niniejszego użytkownika
Problem rozwiązany
» 2017-03-23 15:03:49
Po szczegółowym zagłębieniu się w kod, zrozumiałem jego działanie. Bezpodstawnie zakładałem, że wczytaj liczbę i wczytaj znak, wczytają znak na tej samej pozycji. Zamykam temat.
P-159268
« 1 »
  Strona 1 z 1