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

Rozdział 34 - problem z kontrolą błędów, pytanie do pracy domowej

Ostatnio zmodyfikowano 2014-09-25 20:03
Autor Wiadomość
matex44
Temat założony przez niniejszego użytkownika
Rozdział 34 - problem z kontrolą błędów, pytanie do pracy domowej
» 2014-09-25 17:36:04
Na początek pytanie odnośnie poniższego programu:
C/C++
#include <iostream>
#include <fstream>
#include <string>


using namespace std;

void wyswietlPlik( string sciezka )

{
    int a;
    ifstream plik;
    plik.open( sciezka.c_str() );
    if( plik.good() ) cout << "Sie udalo otworzyc" << endl;
    else cout << "sie nie udalo otworzyc" << endl;
   
   
    while( plik.good() ) {
       
        plik >> a;
        cout << a << endl;
       
    }
    plik.close();
   
}


int main()
{
   
    wyswietlPlik( "d.txt" );
    return 0;
}
Plik d.txt zawiera liczby: 1 2 3 4 oddzielone spacjami.

Po skompilowaniu i uruchomieniu, program wypisuje mi liczby: 1 2 3 4 4 - nie rozumiem skąd się wzięła ta dodatkowa 4.

A teraz pytanie do pracy domowej:
C/C++
#include <iostream>
#include <fstream>
#include <string>


using namespace std;

void wyswietlPlik( string sciezka )

{
    int a;
    int sum = 0;
    ifstream plik;
    plik.open( sciezka.c_str() );
    if( plik.good() ) cout << "Sie udalo otworzyc" << endl;
    else cout << "sie nie udalo otworzyc" << endl;
   
   
    while( !plik.eof() ) {
       
        if( plik.fail() )
        {
            plik.clear();
            continue;
        }
       
        plik >> a;
        cout << a << endl;
       
       
    }
    plik.close();
   
}


int main()
{
   
    wyswietlPlik( "k.txt" );
    return 0;
}
Plik k.txt zawiera ciąg znaków podany w poleceniu: a 1 2 321b9 ac.de ef#@g 5 #3.
Powyższy program ma wybrać jedynie liczby i wypisać je na ekran. Jednak po jego
uruchomieniu, program wypisuje 0 w nieskończoność. Zastanawiam się co jest nie tak.

Będę wdzięczny za wszelkie wskazówki
P-117533
pekfos
» 2014-09-25 17:44:35
Kod 1. Nie sprawdzasz błędów we właściwym miejscu
Kod 2. Nie robisz niczego z błędnymi danymi
P-117537
matex44
Temat założony przez niniejszego użytkownika
» 2014-09-25 18:20:53
Ad 1.
Mógłbyś trochę rozwinąć o jakim sprawdzaniu błędów mówisz?

Tutaj:

if( plik.good() ) cout << "Sie udalo otworzyc" << endl;
    else cout << "sie nie udalo otworzyc" << endl;


Sprawdzam tylko czy udało się otworzyć plik.

A tutaj:


 while( plik.good() ) {
       
        plik >> a;
        cout << a << endl;
       
    }


dopóki plik się nie skończy czyli plik.good() == 1, kolejno wczytuje wartości z pliku do zmiennej a.



Ad. 2. Po drobnej korekcie program wygląda tak:


#include <iostream>
#include <fstream>
#include <string>


using namespace std;

void wyswietlPlik( string sciezka )

{
    int a;
    int sum = 0;
    ifstream plik;
    plik.open( sciezka.c_str() );
    if( plik.good() ) cout << "Sie udalo otworzyc" << endl;
    else cout << "sie nie udalo otworzyc" << endl;
   
   
    while( !plik.eof() ) {            //petla która działa do końca pliku

       plik >> a;                     // zapisujemy znak w danym kroku petli do a
       
        if( plik.fail() )   // jezeli jest jakis blad zapisu to czyscimy flagi bledow i przechodzimy do kolejnego kroku petli while
        {
            plik.clear();
            continue;
        }
       
      
        cout << a << endl;   // wyswietlane sa tylko te znaki, ktore zostaly poprawnie wczytane czyli liczby
       
       
    }
    plik.close();
   
}


int main()
{
   
    wyswietlPlik( "k.txt" );
    return 0;
}

Ja to tak widzę, ale jak jest gdzieś jakiś błąd w tym rozumowaniu to będę wdzięczny za wskazówkę.

Pozdrawiam
P-117545
Jacob99
» 2014-09-25 19:17:56
Wczytuje się tak:
C/C++
while( plik >> a )
{ }
[ / cpp ]
P-117550
pekfos
» 2014-09-25 20:03:21
Wczytuje się tak:
C/C++
while( plik >> a )
{ }
Ho ho, błysnął zapisem nieomówionym w kursie. Jeszcze wyjaśnij, skąd to się wzięło ;)

C/C++
while( plik.good() ) {
    plik >> a;
    cout << a << endl;
}
To nie jest poprawne, bo błąd, jeśli się pojawi, to po wczytaniu wartości, a nie przed. Powinieneś sprawdzać błędy pomiędzy tymi dwoma instrukcjami w środku pętli.

jezeli jest jakis blad zapisu to czyscimy flagi bledow i przechodzimy do kolejnego kroku petli while
..i tak w kółko. Jeśli niepoprawny znak spowoduje błąd, to w kolejnym kroku pętli zrobi to samo.
Ja to tak widzę, ale jak jest gdzieś jakiś błąd w tym rozumowaniu to będę wdzięczny za wskazówkę.
ignore().
P-117558
« 1 »
  Strona 1 z 1