Lekcja 34 Zadanie domowe 1
Ostatnio zmodyfikowano 2014-08-31 14:45
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: #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. |
|
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[] |
|
dawiolp16 |
» 2014-08-31 11:45:01 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. Gdy w pliku będą same liczby i będzie ich więcej niż 8 wyjdziesz poza zakres tablicy. while( plik >> tab[ licznik ] )
Pętla przestanie się wykonywać dopóki nie uda się wczytać liczby. W pliku masz na początku literę a. |
|
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, jak zrobisz tak: Źle to robisz w czytaj dane do stroing nie do int. |
Nie.. |
|
dark488 Temat założony przez niniejszego użytkownika |
» 2014-08-31 13:33:42 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ę). |
|
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.. |
|
dark488 Temat założony przez niniejszego użytkownika |
» 2014-08-31 13:50:56 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. |
|
pekfos |
» 2014-08-31 13:57:27 Bo w żaden sposób nie radzisz sobie z nieprawidłowymi znakami. |
|
« 1 » 2 |