Kolejny Problem Początkującego - Zadanie Pierwsze z Lekcji 34
Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Zarejestruj się!

Kolejny Problem Początkującego - Zadanie Pierwsze z Lekcji 34

AutorWiadomość
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:

C/C++
#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 ?
P-92425
» 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()
P-92427
» 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ść).
P-92428
Temat założony przez niniejszego użytkownika
» 2013-09-22 00:05:06
C/C++
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
P-92445
« 1 »
 Strona 1 z 1