Rozdział 34 - problem z kontrolą błędów, pytanie do pracy domowej
Ostatnio zmodyfikowano 2014-09-25 20:03
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: #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: #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 |
|
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 |
|
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 |
|
Jacob99 |
» 2014-09-25 19:17:56 Wczytuje się tak: while( plik >> a ) { } [ / cpp ] |
|
pekfos |
» 2014-09-25 20:03:21 Ho ho, błysnął zapisem nieomówionym w kursie. Jeszcze wyjaśnij, skąd to się wzięło ;) 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(). |
|
« 1 » |