Lekcja 34 - problem z wypisaniem sumy
Ostatnio zmodyfikowano 2015-08-16 13:30
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. #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 ] |
|
Cansisti |
» 2015-08-15 10:58:58 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. |
|
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. #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. |
|
« 1 » |