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

Zadanie lekcja 34 [trudne zadanie]

Ostatnio zmodyfikowano 2015-01-14 22:14
Autor Wiadomość
dafuck17
Temat założony przez niniejszego użytkownika
Zadanie lekcja 34 [trudne zadanie]
» 2015-01-14 22:04:22
C/C++
/*2. [trudne 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!
*/
//********************************************************************************************************************************************************
#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
}
//********************************************************************************************************************************************************

void wczytajLiczby()
{
    std::ifstream plik;
    plik.open( "D:\\zadanie34.txt" );
    if( plik.good() )
    {
        cout << "Otworzono plik domyslnie!" << endl;
    }
    else {
        cout << "Nie znaleziono pliku" << endl;
        return;
    }
   
   
    int suma = 0;
    int wiersz = 1;
   
    while( !plik.eof() )
    {
       
        int liczba;
        plik >> liczba;
       
        if( plik.fail() )
        {
            plik.clear();
            plik.get();
            cout << "napotkano blad w wierszu nr: " << wiersz;
            continue;
        }
       
        if( plik.bad() )
        {
            plik.clear();
            plik.get();
            cout << "Napotkano blad w wierszu nr: " << wiersz;
            continue;
        }
       
        suma += liczba;
       
       
        if( czyNapotkanoZnakNowegoWiersza( plik ) )
        {
            if( plik.fail() || plik.bad() )
                 cout << "Mamy bledy" << endl;
            else
                 cout << suma << endl;
           
            suma = 0;
            wiersz++;
        }
       
    }
   
}

//********************************************************************************************************************************************************

int main()
{
   
    wczytajLiczby();
   
    return 0;
}
Wydaje mi się że kod jest ok oprócz jednej rzeczy... W 2 linijce tekstu powinno być "Bledne dane w wierszu nr 2!". Mój program wypisuje komunikat ale wraz z nim liczy sumę, której nie powinien liczyć gdy nie udało mu się wczytac wszystkich liczb. Myślałem nad tym ale nie znalazłem sposobu żeby jakoś to pominąć...
P-124953
darko202
» 2015-01-14 22:14:15
wychwytujesz błąd, ale nie przechowujesz tego faktu w dodatkowej zmiennej logicznej
to powoduje, że nie wiadomo, czy w danej linii błąd wystąpił, czy nie
P-124956
« 1 »
  Strona 1 z 1