Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Lekcja 34 - Drugie zadanie domowe

Ostatnio zmodyfikowano 2016-10-07 23:20
Autor Wiadomość
Koperek
Temat założony przez niniejszego użytkownika
Lekcja 34 - Drugie zadanie domowe
» 2016-10-07 22:35:49
Zadanie brzmi:
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

Funkcji "czyNapotkanoZnakNowegoWiersza" nie można modyfikować.
Program działa jak należy, aż do ostatniej linijki gdzie nie może wyjść z pętli "while (!czyNapotkanoZnakNowegoWiersza(plik))". Debug pokazuje że po przejściu do ostatniego wiersza, pętla ta zostaje wykonana 2 razy, a potem odnawia się po słowie kluczowym continue. Nie potrafię znaleźć przyczyny błędu.

C/C++
#include <iostream>
#include <string>
#include <fstream>
using namespace std;

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() || 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 wczytajPlik( string nazwaPliku )
{
    ifstream plik;
    plik.open( nazwaPliku );
    if( !plik.good() )
         return false;
   
    int i = 0;
   
    while( !plik.eof() )
    {
        char bFlagaFail = false;
        int a = 0;
        int suma = 0;
       
        while( !czyNapotkanoZnakNowegoWiersza( plik ) )
        {
            plik >> a;
            if( plik.fail() )
            {
                plik.clear();
                plik.get();
                bFlagaFail = true;
                continue;
            }
            cout << "DEBUG ";
            suma += a;
        }
       
        i++;
        if( bFlagaFail == true )
        {
            cout << "BLAD W LINIJCE NR. " << i << endl;
            continue;
        }
        else
             cout << suma << endl;
       
    }
    return true;
}

int main()
{
    if( !wczytajPlik( "text.txt" ) )
         cout << "BLAD";
   
    system( "pause" );
    return 0;
}
P-152316
mateczek
» 2016-10-07 23:20:08
do szukania błędów zapoznaj się z debugerem .

A do tego problemu fajnie nadaje się z klasa stringstrem
C/C++
#include <fstream>
#include<iostream>
#include<sstream>
using namespace std;
int main() {
    ifstream plik( "plik.txt" );
    if( !plik ) {
        cout << "brak pliku o takiej nazwie ";
        return 0;
    }
    string linijka;
    while( getline( plik, linijka ) ) {
        stringstream ss( linijka );
        int suma = 0, liczba;
        while( ss >> liczba )
             suma += liczba;
       
        if( !ss.eof() )
             cout << "blad tam były inne znaki" << endl;
        else
             cout << "suma= " << suma << endl;
       
    }
   
}
P-152319
« 1 »
  Strona 1 z 1