luuuzik Temat założony przez niniejszego użytkownika |
[Rozdział 34] Sumowanie liczb » 2015-01-23 17:05:52 Mam mały problem z sumowaniem liczb, otóż w moim pliku "r34a.txt" mam zapisane: "a 1 2 321b9 ac.de ef#@g 5 #3". Program poprawnie podlicza wszystkie liczby poza drugą liczbą tj. "2". Wynik, zamiast 341 mam 339. Ktoś może widzi gdzie popełniłem błąd? Oto kod: #include <string> #include <fstream> #include <iostream> using namespace std;
bool wczytajLiczbe( std::ifstream & plik, int & iLiczba ) { int suma; plik.clear(); plik >> iLiczba; if( plik.bad() ) { std::cout << "Wystapil blad sprzetowy!" << std::endl; plik.close(); return false; } else if( plik.fail() ) { std::cout << "Nie udalo sie wczytac liczby!" << std::endl; return false; } else { std::cout << "Liczba = " << iLiczba << std::endl; suma = suma + iLiczba; cout << "Suma wynosi: " << suma << endl; } return true; }
bool wczytajZnak( std::ifstream & plik, char & cZnak ) { plik.clear(); plik >> cZnak; if( plik.bad() ) { std::cout << "Wystapil blad sprzetowy!" << std::endl; plik.close(); return false; } else if( plik.fail() ) { std::cout << "Nie udalo sie wczytac znaku!" << std::endl; return false; } return true; }
bool odczytajPlik( string sNazwaPliku ) { std::ifstream plik; plik.open( sNazwaPliku.c_str() ); if( !plik.good() ) { std::cout << "Nie udalo sie otworzyc pliku." << std::endl; return false; } while( !plik.eof() ) { int iLiczba; char cZnak; if( !wczytajLiczbe( plik, iLiczba ) && plik.bad() ) return false; else if( !wczytajZnak( plik, cZnak ) ) { if( plik.bad() ) return false; else break; } } plik.close(); return true; }
int main() { if( odczytajPlik( "r34a.txt" ) ) std::cout << "Plik zostal wczytany!" << std::endl; return 0; } |
|
bnk120 |
» 2015-01-24 23:33:05 Każdą liczbę Ci wczytuje ? Nie wyrzuca Ci żadnym napisem w konsoli ? |
|
luuuzik Temat założony przez niniejszego użytkownika |
» 2015-01-27 16:17:59 |
|
pekfos |
» 2015-01-29 22:54:42 W pierwszej funkcji suma jest niezainicjalizowana. if( !wczytajLiczbe( plik, iLiczba ) && plik.bad() ) return false; else if( !wczytajZnak( plik, cZnak ) )
|
Jeśli uda się wczytać liczbę, to odczytujesz znak, który wcina ci liczbę 2. |
|
Rashmistrz |
» 2015-02-07 00:09:38 1.Zjada Ci dokładnie w tym miejscu: :F bool wczytajZnak( std::ifstream & plik, char & cZnak ) { plik.clear(); plik >> cZnak; if( plik.bad() ) {
2.Nie zwracasz liczby z funkcji wczytajLiczbe. Zliczać je powinieneś w funkcji odczytajPlik, a to że Ci działa to zliczanie to przypadek, bo int suma; dostaje to samo miejsce co wcześniej. Jak ją zainicjalizujesz ( int suma = 0; ) to zobaczysz o czym mówię. 3.luuuzik... To czysty przypadek że nie wczytało Ci tylko "2". Na poprawnym ciągu "12 23 321 94 55 36" zjada pierwszą cyfrę każdej liczby oprócz pierwszej. Opracuj ten program jeszcze raz, bo on cały jest przekombinowany. |
|
luuuzik Temat założony przez niniejszego użytkownika |
» 2015-02-08 12:46:32 Teraz lepiej? #include <string> #include <fstream> #include <iostream> using namespace std;
int wczytajLiczbe( std::ifstream & plik, int & iLiczba ) { plik.clear(); plik >> iLiczba; if( plik.bad() ) { std::cout << "Wystapil blad sprzetowy!" << std::endl; plik.close(); return false; } else if( plik.fail() ) { return false; } else std::cout << "Liczba = " << iLiczba << std::endl; return iLiczba; }
bool wczytajZnak( std::ifstream & plik, char & cZnak ) { plik.clear(); plik >> cZnak; if( plik.bad() ) { std::cout << "Wystapil blad sprzetowy!" << std::endl; plik.close(); return false; } else if( plik.fail() ) { std::cout << "Nie udalo sie wczytac znaku!" << std::endl; plik.close(); return false; } std::cout << "Napotkany znak = '" << cZnak << "'" << std::endl; return true; }
bool odczytajPlik( std::string pliczek ) { int suma = 0; std::ifstream plik; plik.open( pliczek.c_str() ); if( !plik.good() ) { std::cout << "Nie udalo sie otworzyc pliku." << std::endl; return false; } while( !plik.eof() ) { int iLiczba; char cZnak; if( !wczytajLiczbe( plik, iLiczba ) ) { if( plik.bad() ) { return false; } } else if( !wczytajZnak( plik, cZnak ) ) { if( plik.bad() ) { return false; } } suma = suma + iLiczba; cout << "Suma wynosi: " << suma << endl; } plik.close(); return true; }
int main() { if( odczytajPlik( "r34a.txt" ) ) std::cout << "Plik zostal wczytany!" << std::endl; return 0; }
|
|
Smncru5 |
» 2015-02-09 19:37:31 A ja nie rozumiem kompletnie tego zadania. Kod który napisałem spełnia swoje zadanie, ale jest zbyt prosty i zapewne mija się z celem. Nie mogę też się domyślić jaki sens ma to zadanie, z takim kodem: #include <iostream> #include <string> #include <fstream>
using namespace std;
int main() { ifstream plik; int L1, L2, L3, L4, L5, L6 = 0; char C1, C2, C3; string S1, S2; plik.open( "zadanie3.txt" ); if( !plik.good() ) { cout << "Nie udalo sie wczytac pliku."; return 0; } plik >> C1 >> L1 >> L2 >> L3 >> C2 >> L4 >> S1 >> S2 >> L5 >> C3 >> L6; cout << L1 << " " << L2 << " " << L3 << " " << L4 << " " << L5 << " " << L6 << endl; cout << "Suma liczb wynosi: " << L1 + L2 + L3 + L4 + L5 + L6 << endl; return 0; }
Ktoś naprowadzi mnie na dobrą drogę? :P |
|
Rashmistrz |
» 2015-02-09 21:18:53 @luuuzik Problem jest tu: if( !wczytajLiczbe( plik, iLiczba ) ) { if( plik.bad() ) { return false; } } else if( !wczytajZnak( plik, cZnak ) ) Jak wczyta Ci poprawnie liczbę, warunek nie jest spełniony, więc przechodzi do else, w którym jest if wywołujący wczytanie znaku. Powinieneś jeszcze poprawić system sprawdzania błędu, bo nie powinien się on opierać na zwrócony zerze... @Smncru5 To ma działać dla dowolnego pliku, a nie tylko tego... :F |
|
« 1 » |