Kolejny Problem Początkującego - Zadanie Pierwsze z Lekcji 34
Ostatnio zmodyfikowano 2013-09-22 00:05
Nitr0Skay Temat założony przez niniejszego użytkownika |
Kolejny Problem Początkującego - Zadanie Pierwsze z Lekcji 34 » 2013-09-21 16:46:07 Witam. Przeczytałem uważnie Lekcję 33 o 34, jednak pojawił się pewien problem, podczas zadania. Oto treść zadania: 1. 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. Przykładowa zawartość pliku z danymi: a 1 2 321b9 ac.de ef#@g 5 #3 Oczekiwane standardowe wyjście programu dla przykładowego zestawu danych: 1 2 321 9 5 3 Suma liczb wynosi: 341 No więc napisałem pewien program do tego zadania: #include <iostream> #include <fstream>
bool wczytajPlik( std::string nazwaPliku ) { std::ifstream plik; plik.open( nazwaPliku.c_str() ); if( !plik.good() ) return false; int liczba = 0; int suma = 0; while( !plik.eof() ) { plik >> liczba; if( plik.fail() ) { plik.clear(); continue; } std::cout << liczba; suma += liczba; } std::cout << std::endl; std::cout << suma << std::endl; plik.close(); return true; }
int main() { if( !wczytajPlik( "zadanie.txt" ) ) std::cout << "Nie udalo sie wczytac pliku..." << std::endl; return 0; }
Problem polega na tym, że gdy otwieram ten program, to konsola jest pusta i nic się nie wczytuje. Nie do końca rozumiem dlaczego. Ktoś mógłby mnie może nakierować na to, co ja robię źle ? |
|
Monika90 |
» 2013-09-21 17:14:55 Jak podczas wczytywanie natrafisz na literę, to ta litera zostanie jako nastepny znak w stumieniu dopóki jej nie wyjmiesz. Dodaj plik.get() po plik.clear() |
|
pekfos |
» 2013-09-21 17:15:46 Nie pomijasz nieprawidłowych znaków.
Poza tym, pętla jest zła. eofbit jest ustawiany dopiero po próbie odczytu, gdy nie ma danych w strumieniu. Wtedy jest także ustawiany failbit, a w tym przypadku czyścisz flagi i powtarzasz pętlę (w nieskończoność). |
|
Nitr0Skay Temat założony przez niniejszego użytkownika |
» 2013-09-22 00:05:06 while( !plik.eof() ) { plik >> liczba; if( plik.fail() ) { plik.clear(); plik.get(); continue; } std::cout << liczba << " "; suma += liczba; }
O dziwo linijka plik.get(); pomogła. Muszę się tylko dowiedzieć, co to konkretnie robi, gdyż w tej lekcji tego nie wyczytałem. Dzięki za pomoc ;D Wynik programu jest teraz dokładnie taki sam, jak w treści zadania, a więc zadanie wykonane :) Miłego dnia życzę i Miłej Zabawy z programowaniem ;D |
|
« 1 » |