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

Lekcja 34 - problem z wypisaniem sumy

Ostatnio zmodyfikowano 2015-08-16 13:30
Autor Wiadomość
Andy20
Temat założony przez niniejszego użytkownika
Lekcja 34 - problem z wypisaniem sumy
» 2015-08-15 10:33:48
Witam,
Mam taki problem z tym zdaniem:

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.  np. a 1 2 321b9 ac.de ef#@g 5 #3

Program, który napisałem wypisuję liczby oprócz liczby " 2 ".
Prosiłbym o naprowadzenie, gdzie napisać instrukcję, która będzie wypisywała sumę liczby pobranych z pliku. Aktualnie próa wypisania sumy w aktualnych funkcjach kończy się niepowodzeniem.
C/C++
#include <string>
#include <fstream>
#include <iostream>
using namespace std;

bool wczytajLiczbe( ifstream & plik, int & liczba )
{
    int suma = 0;
    plik.clear();
    plik >> liczba;
    if( plik.bad() )
    {
        cout << "Wystąpił błąd sprzętowy";
        plik.close();
        return false;
    }
    else if( plik.fail() )
    {
        return false;
    }
    else
    {
        cout << liczba << " ";
        suma = suma + liczba;
    }
    return true;
}

bool wczytajZnak( ifstream & plik, char & znak )
{
    plik.clear();
    plik >> znak;
    if( plik.fail() )
         return false;
   
    return true;
}

bool odczytajPlik( string nazwaPliku )
{
    ifstream plik;
    plik.open( nazwaPliku.c_str() );
    if( !plik.good() )
         cout << "Nie udało się otworzyć pliku ";
   
    while( !plik.eof() )
    {
        int liczba;
        char znak;
       
        if( !wczytajLiczbe( plik, liczba ) && plik.bad() )
             return false;
        else if( !wczytajZnak( plik, znak ) )
        {
            if( plik.bad() )
                 return false;
            else
                 break;
           
        }
    }
    plik.close();
    return true;
}

int main()
{
    setlocale( LC_ALL, "Polish" );
    if( odczytajPlik( "C:/folder/text.txt" ) )
         cout << "\nUdało się";
   
    cin.get();
    cin.get();
}
[ \c pp ]
P-136287
Cansisti
» 2015-08-15 10:58:58
C/C++
if( !wczytajLiczbe( plik, liczba ) && plik.bad() )
     return false;
else if( !wczytajZnak( plik, znak ) )
{
    if( plik.bad() )
         return false;
    else
         break;
   
}
}

Tej części w ogóle nie rozumiem, coś tu namieszałeś. Trochę za dużo sprawdzania czy plik został otwarty poprawnie, wystarczy to zrobić raz na początku a nic już go nie ruszy do wywołania plik.close().

Liczenie sumy musisz umieścić w funkcji odczytajPlik() - zadeklaruj zmienną i dodawaj do niej wartość 'liczba' jeśli wczytajLiczbe() zwróci true.

Poza tym nie wiem po co funkcja wczytajZnak() skoro masz wypisać tylko liczby.
P-136289
Andy20
Temat założony przez niniejszego użytkownika
» 2015-08-16 13:30:25
Funkcję wczytajznak() chciałem wykorzystać w takim przypadku, że jeśli program napotka znak, a nie liczbę, żeby zwrócił false.
W tym momencie mam coś takiego, lecz teraz w ogóle nie wypisuje mi wczytanych liczb. Program zatrzymuje się na pierwszej zmiennej, która jest znakiem.

C/C++
#include <fstream>
#include <iostream>
using namespace std;

bool wczytajLiczbe( ifstream & plik, int & liczba )
{
    plik.clear();
    plik >> liczba;
    if( plik.bad() || plik.fail() )
    {
        cout << "Wystąpił błąd sprzętowy, lub wczytano znak";
        plik.close();
        return false;
    }
   
    return true;
}

bool odczytajPlik( string nazwaPliku )
{
    int suma = 0, liczba;
    char znak;
    ifstream plik;
    plik.open( nazwaPliku.c_str() );
    if( !plik.good() )
         cout << "Nie udało się otworzyć pliku ";
   
    while( !plik.eof() )
    {
       
        if( wczytajLiczbe( plik, liczba ) )
        {
            cout << liczba << " ";
            suma += liczba;
        }
        else
        {
            plik.clear();
            plik >> znak;
            return false;
        }
    }
    cout << "Suma = " << suma;
    plik.close();
   
    return true;
}

int main()
{
    setlocale( LC_ALL, "Polish" );
    if( odczytajPlik( "C:/folder/text.txt" ) )
         cout << "\nUdało się";
   
    cin.get();
    cin.get();
}
[ \c pp ]


Udało mi się rozwiązać problem,
@Cansisti: dzięki za pomoc.
P-136357
« 1 »
  Strona 1 z 1