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

[Rozdział 34] Wczytywanie zawartości pliku, a kontrola błędów - zadanie domowe.

Ostatnio zmodyfikowano 2014-04-21 13:18
Autor Wiadomość
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:
C/C++
#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.
P-108438
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.



P-108443
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
P-108454
« 1 »
  Strona 1 z 1