Problem z zadaniem (wczytywanie liczb)

0

Witam, otóż dotarłem w kursie na cpp0x do rozdziału 4.3 i męczę się nad 2 zadaniem http://cpp0x.pl/kursy/Kurs-C++/Poziom-4/Wczytywanie-zawartosci-pliku-a-kontrola-bledow/485
napisałem taki kod:

#include <iostream>
#include <fstream>
using namespace std;

bool newl(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() || plik.bad() )
             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() || plik.bad() )
             return false; //wyst¹pi³ b³¹d odczytu danych

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

    } //for
}

bool nload(string fname)
{
    ifstream file;
    file.open(fname.c_str());
    if (!file.good())
    return false;

    int n,s=0,l=1,d=0;

    while (!file.eof())
    {
        file>>n;
        if (file.fail())
        {
            file.clear();
            file.get();
            d=1;
            continue;
        }

        s+=n;
        if (newl(file))
        {
           if(d>0)
           {
               cout<<"error in line "<<l<<endl;
               s=0;
               d=0;
               l++;
           }
            else
            {
                cout<<s<<endl;
                s=0;
                d=0;
                l++;
            }

        }
    }
    }


int main()
{
 if (!nload("file2.txt"))
    cout<<"nie udalo sie wyswietlic pliku";

    return 0;
}

Teoretycznie wszystko działa, ale kiedy w tekście błąd jest na ostatnim miejscu wiersza coś się psuje, przykładowo po dopisaniu 6 linijki do wczytania: 4 G D, program w ogóle jej nie uwzględnia, nie mam pojęcia gdzie jest błąd

0

Program w ogóle nie sprawdza ci ostatniej linijki, pomija ją. Musisz umieścić warunki if ( d > 0) ... else z pętli while (!file.eof()) także za pętlą.
Poza tym popracuj trochę nad kodem, nazewnictwo itp bo oczopląsu można dostać, Niepotrzebne mieszanie nazewnictwa polskiego i angielskiego, zmienne d, l itd. można by nazywać sensowniej, np bool error i int line.

0
void SumujLiczbyWWieszachStrumienia(istream& in, ostream& out)
{
    string linia;
    int nrLinii = 0;
    while (getline(in, linia))
    {
           ++nrLinii;
           istringstream slinia(linia);
           int suma = 0, x;
           while (slinia >> x)
           {
                 suma += x;
           }
           if (slinia.eof()) {
                out << suma
           } else {
                out << "Bledne dane w wierszu nr" << nrLinii << '!';
           }
           out << '\n';
    }
    out << flush;
}

int main()
{
    ifstream plik("file2.txt");
    if (plik.is_open()) {
           SumujLiczbyWWieszachStrumienia(plik, cout);
    } else {
           cerr << "Nie otwarto pliku" << endl;
    }
    return 0;
}
0

Zmodyfikowałem trochę kod na coś takiego: http://pastebin.com/yf9ZAgLg
Użyłem funkcji file.ignore(numeric_limits<streamsize>::max(),'\n'); której znaczenie wydaje mi się, że znam, ale pętla wykonuje się w niekończoność :/

0

Wygląda na to że nie tędy droga, kod wydaje się przekombinowany. Spróbuj podejść do problemu inaczej, popatrz np na kod podany przez MareKR22.

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