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

Rozdział 34, zadanie drugie

Ostatnio zmodyfikowano 2017-02-21 00:13
Autor Wiadomość
bobby.hl
Temat założony przez niniejszego użytkownika
Rozdział 34, zadanie drugie
» 2017-02-20 22:55:56
Witam, pomóżcie proszę bo kombinuję drugi dzień i nie mogę dojść do sedna problemu.
Oto kod:

C/C++
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

bool nowyWiersz( 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 wczytajLiczbe( ifstream & plik, int & liczba )
{
    plik.clear();
    plik >> liczba;
    if( plik.bad() )
    {
        cout << "Wystapil blad sprzetowy!";
        plik.close();
        return false;
    }
   
    if( plik.fail() )
    {
        char znak;
        plik.clear();
        plik >> znak;
       
        return false;
    }
    return true;
}


bool wczytajPlik( string nazwaPliku )
{
    ifstream plik;
    plik.open( nazwaPliku.c_str() );
    if( !plik.good() )
         return false;
   
    int liczba;
    int wiersz = 1;
    int suma = 0;
    while( !plik.eof() )
    {
        wczytajLiczbe( plik, liczba );
        suma += liczba;
       
        if( nowyWiersz( plik ) )
        {
            cout << suma << endl;
            suma = 0;
            wiersz++;
           
        }
       
        if( !wczytajLiczbe( plik, liczba ) )
        {
            cout << "Bledne dane w wierszu nr " << wiersz << endl;
            suma = 0;
            wiersz++;
           
        }
       
    }
    plik.close();
    return true;
}

int main()
{
    if( !wczytajPlik( "roz 34 zad 2.txt" ) )
         cout << "Nie wczytano pliku!" << endl;
   
    return 0;
}

W tej postaci źle sumuje, ale dobrze informuje, że w danych wierszach jest błąd.
Ale tylko w teorii bo nawet jak zmienię ostatni wiersz w pliku na poprawny (same liczby) to nadal informuje o błędnych danych.

Jeśli wyrzucę cały warunek :

C/C++
if( !wczytajLiczbe( plik, liczba ) )
{
    cout << "Bledne dane w wierszu nr " << wiersz << endl;
    suma = 0;
    wiersz++;
   
}

zaczyna sumować dobrze liczby z wierszy ale pomija ostatni.
Rozwiązaniem jest zmiana warunku
C/C++
if( nowyWiersz( plik ) )
{
    cout << suma << endl;
    suma = 0;
    wiersz++;

na

C/C++
if( nowyWiersz( plik ) || plik.eof() )
{
    cout << suma << endl;
    suma = 0;
    wiersz++;

teraz wszystko działa. Prawie :)
Bo teraz jak wrzucę spowrotem warunek

C/C++
if( !wczytajLiczbe( plik, liczba ) )
{
    cout << "Bledne dane w wierszu nr " << wiersz << endl;
    suma = 0;
    wiersz++;
   
}

to znowu przestaje dobrze sumować i jeszcze dodatkowo dorzuca nowy 6 wiersz!
Wpatruje się i kombinuje z tym kodem już ładnych parę godzin i nic nie pomaga!
Bardzo Was proszę, Panie i Panowie, o pomoc!!!
P-158077
pekfos
» 2017-02-20 23:01:18
C/C++
wczytajLiczbe( plik, liczba ); // wczytywanie
suma += liczba; // sumowanie

if( nowyWiersz( plik ) )
{
    cout << suma << endl;
    suma = 0;
    wiersz++;
   
}

if( !wczytajLiczbe( plik, liczba ) ) // kolejne wczytywanie, bez sumowania
{
    cout << "Bledne dane w wierszu nr " << wiersz << endl;
    suma = 0;
    wiersz++;
   
}
P-158078
bobby.hl
Temat założony przez niniejszego użytkownika
» 2017-02-20 23:09:29
tzn? jak dodam do tego warunku
suma += liczba;
nic się nie zmienia...
P-158079
pekfos
» 2017-02-20 23:15:39
Czyli gdzie? Do kodu wykonującego się, kiedy nie uda się niczego wczytać..?
P-158080
bobby.hl
Temat założony przez niniejszego użytkownika
» 2017-02-20 23:19:22
no właśnie nie wiem gdzie miałbym dać sumowanie żeby miało to sens.
a tak btw to czemu mówisz że warunek
if
 jest kolejnym wczytywaniem?
czy źle zrozumieałem Twój komentarz?
P-158082
pekfos
» 2017-02-20 23:23:10
Bo warunek dosłownie brzmi "Wczytaj liczbę i jeśli się nie udało, to..". Masz w pętli 2 osobne wywołania tej funkcji.
P-158083
bobby.hl
Temat założony przez niniejszego użytkownika
» 2017-02-20 23:30:40
Przez kolejną dobę nie doszedłbym do tego że warunkowanie
if
 uruchamia funkcję!
A przecież w main to jest zastosowane! jesus!

C/C++
while( !plik.eof() )
{
    if( nowyWiersz( plik ) || plik.eof() )
    {
        cout << suma << endl;
        suma = 0;
        wiersz++;
    }
   
    if( wczytajLiczbe( plik, liczba ) )
         suma += liczba;
    else
    {
        cout << "Bledne dane w wierszu nr " << wiersz << endl;
        suma = 0;
        wiersz++;
    }
   
}
plik.close();
return true;

sumuje, ale dubluje 3 wiersz, muszę dojść dlaczego. blisko, jestem blisko :P
Dzięki wielkie :)

EDIT:
NIE DUBLUJE, tylko wyświetla mi "5" pomiędzy drugim a czwartym wierszem (dodałem "1" do trzeciego wiersza)

6
Bledne dane w wierszu nr 2
5
6
13
Bledne dane w wierszu nr 6

Process returned 0 (0x0)   execution time : 0.078 s
Press any key to continue.

Skąd teraz ta piątka się wzięła, wcześniej tego nie było! ;)[/code]
P-158084
pekfos
» 2017-02-20 23:56:22
Wykrywasz błędne dane w środku wiersza. Gdzie w kodzie odrzucasz dalszą część błędnego wiersza?
P-158086
« 1 » 2
  Strona 1 z 2 Następna strona