Rozdział 34, zadanie drugie
Ostatnio zmodyfikowano 2017-02-21 00:13
bobby.hl Temat założony przez niniejszego użytkownika |
Rozdział 34, zadanie drugie » 2017-02-20 22:55:56 Witam, pomóżcie proszę bo kombinuję drugi dzień i nie mogę dojść do sedna problemu. Oto kod: #include <iostream> #include <fstream> #include <string>
using namespace std;
bool nowyWiersz( ifstream & plik ) { char cZnak; for(;; ) { plik.clear(); cZnak = plik.peek(); if( plik.fail() || plik.bad() ) return false; if( !isspace( cZnak ) ) return false; plik.get( cZnak ); if( plik.fail() || plik.bad() ) return false; if( cZnak == '\n' ) return true; } }
bool wczytajLiczbe( ifstream & plik, int & liczba ) { plik.clear(); plik >> liczba; if( plik.bad() ) { cout << "Wystapil blad sprzetowy!"; plik.close(); return false; } if( plik.fail() ) { char znak; plik.clear(); plik >> znak; return false; } return true; }
bool wczytajPlik( string nazwaPliku ) { ifstream plik; plik.open( nazwaPliku.c_str() ); if( !plik.good() ) return false; int liczba; int wiersz = 1; int suma = 0; while( !plik.eof() ) { wczytajLiczbe( plik, liczba ); suma += liczba; if( nowyWiersz( plik ) ) { cout << suma << endl; suma = 0; wiersz++; } if( !wczytajLiczbe( plik, liczba ) ) { cout << "Bledne dane w wierszu nr " << wiersz << endl; suma = 0; wiersz++; } } plik.close(); return true; }
int main() { if( !wczytajPlik( "roz 34 zad 2.txt" ) ) cout << "Nie wczytano pliku!" << endl; return 0; }
W tej postaci źle sumuje, ale dobrze informuje, że w danych wierszach jest błąd. Ale tylko w teorii bo nawet jak zmienię ostatni wiersz w pliku na poprawny (same liczby) to nadal informuje o błędnych danych. Jeśli wyrzucę cały warunek : if( !wczytajLiczbe( plik, liczba ) ) { cout << "Bledne dane w wierszu nr " << wiersz << endl; suma = 0; wiersz++; }
zaczyna sumować dobrze liczby z wierszy ale pomija ostatni. Rozwiązaniem jest zmiana warunku if( nowyWiersz( plik ) ) { cout << suma << endl; suma = 0; wiersz++;
na if( nowyWiersz( plik ) || plik.eof() ) { cout << suma << endl; suma = 0; wiersz++;
teraz wszystko działa. Prawie :) Bo teraz jak wrzucę spowrotem warunek if( !wczytajLiczbe( plik, liczba ) ) { cout << "Bledne dane w wierszu nr " << wiersz << endl; suma = 0; wiersz++; }
to znowu przestaje dobrze sumować i jeszcze dodatkowo dorzuca nowy 6 wiersz! Wpatruje się i kombinuje z tym kodem już ładnych parę godzin i nic nie pomaga! Bardzo Was proszę, Panie i Panowie, o pomoc!!! |
|
pekfos |
» 2017-02-20 23:01:18 wczytajLiczbe( plik, liczba ); suma += liczba;
if( nowyWiersz( plik ) ) { cout << suma << endl; suma = 0; wiersz++; }
if( !wczytajLiczbe( plik, liczba ) ) { cout << "Bledne dane w wierszu nr " << wiersz << endl; suma = 0; wiersz++; } |
|
|
bobby.hl Temat założony przez niniejszego użytkownika |
» 2017-02-20 23:09:29 tzn? jak dodam do tego warunku suma += liczba; nic się nie zmienia... |
|
pekfos |
» 2017-02-20 23:15:39 Czyli gdzie? Do kodu wykonującego się, kiedy nie uda się niczego wczytać..? |
|
bobby.hl Temat założony przez niniejszego użytkownika |
» 2017-02-20 23:19:22 no właśnie nie wiem gdzie miałbym dać sumowanie żeby miało to sens. a tak btw to czemu mówisz że warunek if jest kolejnym wczytywaniem? czy źle zrozumieałem Twój komentarz? |
|
pekfos |
» 2017-02-20 23:23:10 Bo warunek dosłownie brzmi "Wczytaj liczbę i jeśli się nie udało, to..". Masz w pętli 2 osobne wywołania tej funkcji. |
|
bobby.hl Temat założony przez niniejszego użytkownika |
» 2017-02-20 23:30:40 Przez kolejną dobę nie doszedłbym do tego że warunkowanie if uruchamia funkcję! A przecież w main to jest zastosowane! jesus! while( !plik.eof() ) { if( nowyWiersz( plik ) || plik.eof() ) { cout << suma << endl; suma = 0; wiersz++; } if( wczytajLiczbe( plik, liczba ) ) suma += liczba; else { cout << "Bledne dane w wierszu nr " << wiersz << endl; suma = 0; wiersz++; } } plik.close(); return true; sumuje, ale dubluje 3 wiersz, muszę dojść dlaczego. blisko, jestem blisko :P Dzięki wielkie :) EDIT: NIE DUBLUJE, tylko wyświetla mi "5" pomiędzy drugim a czwartym wierszem (dodałem "1" do trzeciego wiersza) 6 Bledne dane w wierszu nr 2 5 6 13 Bledne dane w wierszu nr 6
Process returned 0 (0x0) execution time : 0.078 s Press any key to continue.
Skąd teraz ta piątka się wzięła, wcześniej tego nie było! ;)[/code] |
|
pekfos |
» 2017-02-20 23:56:22 Wykrywasz błędne dane w środku wiersza. Gdzie w kodzie odrzucasz dalszą część błędnego wiersza? |
|
« 1 » 2 |