[Rozdział 34] Wczytywanie zawartości pliku, a kontrola błędów - zadanie domowe.
Ostatnio zmodyfikowano 2014-04-21 13:18
x0ax Temat założony przez niniejszego użytkownika |
[Rozdział 34] Wczytywanie zawartości pliku, a kontrola błędów - zadanie domowe. » 2014-04-20 19:13:23 Witam. Jestem początkującym "programistą", że tak sobie posłodzę :) i prawdopodobnie problem może być banalny, jednak nie rozumiem wyniku mojego programu, z poniższego zadania domowego: [lekcja 34] 1. Napisz program, który wczyta z pliku liczby całkowite i wypisze je na ekranie. Wszelkie nieprawidłowe znaki mają zostać pominięte. Program ma wypisać również sumę wszystkich wczytanych liczb. Przykładowa zawartość pliku z danymi: a 1 2 321b9 ac.de ef#@g 5 #3 Oczekiwane standardowe wyjście programu dla przykładowego zestawu danych: 1 2 321 9 5 3 Suma liczb wynosi: 341 Stworzyłem plik, w którym zamieściłem proponowany tekst, niestety wynik jest trochę dziwny. Liczby są wyświetlane, ale program pomija cyfrę 2 z pliku, a jak usunę z pliku wymienioną 2-kę, lub dodam inna liczbę, wtedy np. z 321 znika cyfra 3. Treść programu: #include <string> #include <fstream> #include <iostream> using namespace std;
bool wczytajLiczbe( ifstream & plik, int & iLiczba, int & suma ) { plik.clear(); plik >> iLiczba; if( plik.bad() ) { cout << "Wystapil blad sprzetowy!" << endl; plik.close(); return false; } else if( plik.fail() ) { return false; } else cout << iLiczba << " "; suma += iLiczba; return true; }
bool wczytajZnak( ifstream & plik, char & cZnak ) { plik.clear(); plik >> cZnak; if( plik.bad() ) { cout << "Wystapil blad sprzetowy!" << endl; plik.close(); return false; } else if( plik.fail() ) { return false; } return true; }
bool odczytajPlik( string NazwaPliku, int & suma ) { ifstream plik; plik.open( NazwaPliku.c_str() ); if( !plik.good() ) { cout << "Nie udalo sie otworzyc pliku." << endl; return false; } while( !plik.eof() ) { int iLiczba; char cZnak; if( !wczytajLiczbe( plik, iLiczba, suma ) && plik.bad() ) return false; else if( !wczytajZnak( plik, cZnak ) ) if( plik.bad() ) return false; } plik.close(); return true; }
int main() { int suma = 0; odczytajPlik( "dane.txt", suma ); cout << "\nSuma liczb wynosi: " << suma << endl; return 0; } Dane z pliku: a 1 2 321b9 ac.de ef#@g 5 #3 Wynik: 1 321 9 5 3 Suma liczb wynosi: 339
Proszę o sugestie, co złego zrobiłem lub naprowadzenie na ścieżkę błędu :). To mój pierwszy post tutaj więc z góry przepraszam, jeżeli źle sformułowałem pytanie. |
|
bombatom69 |
» 2014-04-20 22:55:57 Nie ma konieczności zczytywania tych spacji. Możesz sobie to darować.
Jesli jednak potrzebujesz testować znaki to nie powinienes wyprowadzać ich ze strumienia od razu - obejrzyj sobie metodę peek.
A skoro zaczynasz dopiero zabawę:
1. To moze powinienes tez zwrocić uwagę na jakość kodu. Bez obrazy, nazbyt niechlujny produkujesz.
2. W sytuacji gdy zwracasz sterowanie w pierwszym warunku z bloku, to warto przemyśleć całkowite wyłączenie tego ifa z bloku.
3. Na pewno warto zachować w bloku if-elseif-else konsekwencję: albo wstawiasz klamry wszędzie, albo nigdzie. Na początku programowania najlepiej zdecyduj się na wstawianie wszędzie.
|
|
x0ax Temat założony przez niniejszego użytkownika |
» 2014-04-21 13:18:52 Muszę się przyznać iż program przerabiałem, nie pisałem go od nowa. Przyjąłem taką taktykę że jak nie do końca coś rozumiem, to przerabiam do bólu, zmieniam i sprawdzam jak się coś zachowa, aż opanuję temat i wtedy staram się napisać kilka swoich programów. To tak w gwoli wytłumaczenia niechlujności :).
Dziękuję za za szczerość i podpowiedzi. Skupię się na modyfikacji całego programu, usuwając zbędne funkcje. Póki co nie zamykam tematu, w razie moich dalszych niepowodzeń lub do czasu aż znajdę prawidłowe rozwiązanie.
Pozdrawiam |
|
« 1 » |