Problem z wczytywaniem zawartości z pliku

0

Cześć, uczę się c++ robiąc jeden z kursów Online.
Mam oto takie zadanie:
Napisz program, który dla każdego wiersza w pliku:
-wczyta liczby i wypisze ich sumę w przypadku, gdy wszystkie liczby uda się wczytać;
-wypisze komunikat o błędnych danych, jeżeli wystąpi błąd podczas wczytywania liczb (komunikat ma wyświetlać numer wiersza, w którym wystąpił błąd)
Przykładowe dane:
1 2 3
3 4 a 5
3 2
5 2 2 1 3

3 4

Oczekiwane standardowe wyjście programu dla przykładowego zestawu danych:
6
Bledne dane w wierszu nr 2!
5
13
Bledne dane w wierszu nr 5!

Wykorzystaj poniższą funkcję do wykrywania znaku przejścia do nowej linii:
C/C++
bool czyNapotkanoZnakNowegoWiersza( std::ifstream & plik )
{
char cZnak;
for(;; ) //nieskończona pętla
{
plik.clear();
cZnak = plik.peek(); //sprawdzamy jaki kolejny znak zostanie zwrócony przez operację odczytu
if( plik.fail() )
return false; //wystąpił błąd odczytu danych

    if( !isspace( cZnak ) )
         return false; //pobrany znak nie jest białym znakiem
    
    plik.get( cZnak ); //odczytujemy biały znak z pliku
    if( plik.fail() )
         return false; //wystąpił błąd odczytu danych
    
    if( cZnak == '\n' )
         return true;
    
} //for

}
Powyższej funkcji nie wolno modyfikować.

Link do zadania:
http://cpp0x.pl/kursy/Kurs-C++/Poziom-4/Wczytywanie-zawartosci-pliku-a-kontrola-bledow/485

Mój kod:

#include <iostream>
#include <fstream>

using namespace std;

bool czyNapotkanoZnakNowegoWiersza( ifstream & plik )
{
    char cZnak;
    for(;; )
    {
        plik.clear();
        cZnak = plik.peek();
        if( plik.fail() )
            return false;

        if( !isspace( cZnak ) )
            return false;

        plik.get( cZnak );
        if( plik.fail() )
            return false;

        if( cZnak == '\n' )
            return true;

    }
}

bool odczytajPlik(string nazwaPliku) {
    ifstream plik;
    plik.open(nazwaPliku.c_str());
    if (!plik.good()) {
        cout << "Nie udalo sie otworzysc pliku";
        return false;
    }
    int suma = 0;
    int liczba;
    int wiersz=1;
    string linia;
    while (1) {
        int liczba;
        char cZnak;

        plik >> liczba;

        if( !plik.fail() ) {
            suma += liczba;
            if(czyNapotkanoZnakNowegoWiersza(plik)){
                wiersz++;
                cout << suma << endl;
                suma=0;
            }
        }

        else
        {
            if( plik.bad() )
                return false; //wczytanie liczby nie powiodło się z powodu poważnego błędu

            plik.clear();
            plik >> cZnak;

            if( !plik.fail() ) {
                suma=0;
                cout << "Bledne dane w wierszu " << wiersz << "!" << endl;
                plik.clear();
                wiersz++;
            }
            else
            {
                if( plik.eof() )
                    break;

                return false; // wczytanie znaku powinno zawsze się udać, chyba że skończyły się dane
            } //if
        } //if
    } //while
    plik.close();

    return true;
}

    int main() {
        if( !odczytajPlik( "Odczyt.txt" ) )
            cout << "Plik nie zostal otwarty" << endl;
        return 0;
    }

A oto co dostaje:
6
Bledne dane w wierszu 2!
5
5
13
Bledne dane w wierszu 6!

Widziałem rozwiązanie ze wstawieniem getlina lecz chciałbym to napisać bez użycia getlina

2

Parząc na samą funkcję czyNapotkanoZnakNowegoWiersza stwierdzam, że będzie lepiej jak znajdziesz inny kurs online.
Przysłowiowe "prowadził ślepy kulawego" (może podaj linka).
https://wandbox.org/permlink/KnyaC6TKCp5nLJls

1 użytkowników online, w tym zalogowanych: 0, gości: 1