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

Lekcja 34 Zadanie domowe 1

Ostatnio zmodyfikowano 2014-08-31 14:45
Autor Wiadomość
dark488
Temat założony przez niniejszego użytkownika
Lekcja 34 Zadanie domowe 1
» 2014-08-31 08:45:11
Witam. Otóż mam następujący problem z tym programem z zadania domowego, który ma za zadanie wczytywać z pliku z liczbami i znakami tylko liczby wypisywać je i sumować, jednak nie wszystko działa zgodnie z planem: 

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

bool Operacje( string nazwa )
{
    ifstream plik;
    plik.open( nazwa.c_str() );
   
    if( !plik.good() || plik.bad() )
    {
        cout << "Nie udalo sie odczytac pliku" << endl;
        return false;
    }
   
    int tab[ 8 ];
    string wiersz;
    int licznik = 0;
    int suma = 0;
   
    cout << "Witam" << endl << endl;
    while( plik >> tab[ licznik ] )
    {
        if( plik.bad() )
        {
            cout << "Nastapil blad sprzetowy!" << endl;
            plik.close();
            return false;
        }
       
        if( plik.fail() )
        {
            plik.clear();
            continue;
        }
       
        cout << tab[ licznik ] << " ";
        licznik++;
    }
   
    for( int licznik2 = 0; licznik2 < 8; licznik2++ )
         suma += tab[ licznik2 ];
   
    cout << "\n\nSuma wynosi " << suma << endl;
    plik.close();
    return true;
}

int main()
{
    if( Operacje( "liczby.txt" ) )
         cout << "Wszystko sie wczytalo!" << endl;
   
    return 0;
}
 
Wynik działanie tego programu powinien być następujący:

Witam

1 2 321 9 5 3

Suma wynosi 341
Wszystko sie wczytalo!
 
Natomiast w moim programie wyskakuje takie coś: 
Witam



Suma wynosi -2142900796
Wszystko sie wczytalo!
 
Oto dane wejsciowe do programu: 
a 1 2 321b9 ac.de ef#@g 5 #3
 
Sądzę, że plik.fail() powoduje problemy ale nijak nie mogę tego rozwiązać. Liczę na pomoc, pozdrawiam.

PS. Dodam, że oprócz powyższej wersji programu stosowałem także inne, np. bez używania continue czy też tablic, pętli for czy też plik.eof() ale zawsze był ten sam, zły efekt.

P-116441
1aam2am1
» 2014-08-31 11:03:13
Źle to robisz w czytaj dane do stroing nie do int. I tam dopiero sprawdzają jakie są dane jak dobre to przepisz do int[]
P-116445
dawiolp16
» 2014-08-31 11:45:01
C/C++
if( !plik.good() || plik.bad() )

Metoda good zwraca prawdę gdy żadna z flag eofbit, failbit i badbit nie jest ustawiona.
Metoda bad zwraca prawdę gdy flaga badbit jest ustawiona.
Dlaczego to ORujesz?
Wystarczy ze zrobisz tak.

C/C++
if( !plik.good() )

Gdy w pliku będą same liczby i będzie ich więcej niż 8 wyjdziesz poza zakres tablicy.

C/C++
while( plik >> tab[ licznik ] )
Pętla przestanie się wykonywać dopóki nie uda się wczytać liczby.
W pliku masz na początku literę a.
P-116446
pekfos
» 2014-08-31 12:05:17
Tablica jest tu niepotrzebna i nieprawidłowo użyta. Do tego pętla wczytująca jest źle napisana.

Wystarczy ze zrobisz tak

C/C++
if( !plik.good() )
Wystarczy, jak zrobisz tak:
C/C++
if( plik.fail() )

Źle to robisz w czytaj dane do stroing nie do int.
Nie..
P-116448
dark488
Temat założony przez niniejszego użytkownika
» 2014-08-31 13:33:42
C/C++
while( !plik.eof() )
{
    if( plik.bad() )
    {
        cout << "Nastapil blad sprzetowy!" << endl;
        plik.close();
        return false;
    }
    else
    if( plik.fail() )
    {
        plik.clear();
        return false;
    }
    else
    { cout << liczby << " ";
        suma += liczby; }
}
 
Próbowałem z .eof() ale też nie działa (pętla nie kończy się).
P-116453
pekfos
» 2014-08-31 13:37:16
Dalej źle. W tej pętli nawet nie ma wczytywania, nie wspominając nawet o prawidłowym jego oprogramowaniu..
P-116454
dark488
Temat założony przez niniejszego użytkownika
» 2014-08-31 13:50:56
C/C++
while( !plik.eof() )
{
    plik >> liczby;
    if( plik.bad() )
    {
        cout << "Nastapil blad sprzetowy!" << endl;
        plik.close();
        return false;
    }
    else
    if( plik.fail() )
    { plik.clear();
        continue; }
    else
    { cout << liczby << " ";
        suma += liczby;
        return true; }
}
 
Następna próba... nieudana. Aplikacja się zawiesza.
P-116455
pekfos
» 2014-08-31 13:57:27
Bo w żaden sposób nie radzisz sobie z nieprawidłowymi znakami.
P-116457
« 1 » 2
  Strona 1 z 2 Następna strona