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

[Poziom 4 Lekcja 34] Zadanie lekko tuningowane - Zawieszenie programu po wczytaniu mix'a liter ze znakami.

Ostatnio zmodyfikowano 2014-01-08 20:18
Autor Wiadomość
Krump
Temat założony przez niniejszego użytkownika
[Poziom 4 Lekcja 34] Zadanie lekko tuningowane - Zawieszenie programu po wczytaniu mix'a liter ze znakami.
» 2013-12-26 15:44:49
Witam,

Mam mały problem. Otóż celem programiku jest, aby czytał liczby i je sumował oraz podawał ilość błędów. Ogólnie coś tam działa, bo jak ma w wierszu liczby i litery to ładnie litery pomija odpowiednio nabijając ilość błędów i sumuje.
1. Problem pojawia się, gdy przy wczytywaniu natrafi na mix'a, czyli wyraz z literami i cyframi. Wtedy się zawiesza. Siedzę nad tym już trochę i nie mogę dociec, dlaczego się zawiesza.
2. Drugi problem, który spostrzegłem to jak dojdzie do końca, to też się zawiesza.

Gdzie robię błąd?

Programik:
C/C++
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <string>
#include <conio.h>

using namespace std;

bool czyNapotkanoZnakNowegoWiersza( std::ifstream & plik )
{
    char cZnak;
    for(;; )
    {
        plik.clear();
        cZnak = plik.peek();
        if( plik.fail() || plik.bad() )
             return false;
       
        if( !isspace( cZnak ) )
             return false;
       
        plik.get( cZnak );
        if( plik.fail() || plik.bad() )
             return false;
       
        if( cZnak == '\n' )
             return true;
       
    }
}
bool czyNapotkanoZnakspacji( std::ifstream & plik )
{
    char cZnak;
    for(;; )
    {
        plik.clear();
        cZnak = plik.peek();
        if( plik.fail() || plik.bad() )
             return false;
       
        if( !isspace( cZnak ) )
             return false;
       
        plik.get( cZnak );
        if( plik.fail() || plik.bad() )
             return false;
       
        if( cZnak == ' ' )
             return true;
       
    }
};
int main( int argc, char ** argv )
{
    ifstream plik;
    int suma = 0, wiersz = 1, liczba = 0, suma_bledow = 0;
    plik.open( "text.txt" );
    if( !plik.good() )
    {
        cout << "Nie udalo sie otworzyc pliku :/ ";
        getch();
        return false;
    }
    while( plik )
    {
        plik >> liczba;
        if( plik.fail() )
        {
            plik.clear();
            liczba = 0;
            suma_bledow++;
            while( !czyNapotkanoZnakspacji( plik ) )
            {
                if( !czyNapotkanoZnakNowegoWiersza( plik ) )
                     plik.get();
                else
                     break;
               
            }
        }
        suma += liczba;
        if( czyNapotkanoZnakNowegoWiersza( plik ) || plik.eof() )
        {
            cout << "Suma liczb w " << wiersz << " wierszu to: " << suma << " Liczba bledow to: " << suma_bledow << endl;
            suma = 0;
            wiersz++;
            suma_bledow = 0;
        }
    }
    getch();
    return 0;
}

Plik na którym operuje:

1 a 2 55
1 d 2 3
1d3
5
P-100170
pekfos
» 2013-12-26 15:56:14
Nie sprawdzasz (poprawnie) eofa. Doczytaj w dokumentacji, kiedy i z czym jest on ustawiany.
P-100171
Krump
Temat założony przez niniejszego użytkownika
» 2013-12-26 15:59:21
Chodzi ci o pierwszego whila? To moje przyzwyczajenie, a na to samo wychodzi co plik.eof() i też nie działa.
P-100172
pekfos
» 2013-12-26 16:03:46
Nie o to chodzi. Nigdzie w tym programie nie ma prawidłowego sprawdzania błędów, pod kątem końca pliku. Jak pisałem, doczytaj w dokumentacji.
P-100173
Krump
Temat założony przez niniejszego użytkownika
» 2013-12-26 16:28:44
Dobra wiem już o co ci chodzi, tylko nie za bardzo wiem na czym polega mój błąd, jak sobie z nim poradzić. Pewnie dlatego że już za długo się z tym męczę.
P-100174
Krump
Temat założony przez niniejszego użytkownika
» 2013-12-26 20:14:15
To powiesz co skopałem, bo ciągle mi wywal błędy.
P-100226
pekfos
» 2013-12-26 20:21:06
Przy wczytywaniu operatorem >>, gdy jest ustawiany eofbit, to razem z failbitem. Sprawdzasz drugie, czyścisz flagi, a potem sprawdzasz pierwsze (bezskutecznie). Przy peek(), gdy nie ma danych do odczytania, jest ustawiany sam eofbit, a nie failbit, ani tym bardziej badbit.
P-100228
Krump
Temat założony przez niniejszego użytkownika
» 2013-12-26 20:38:59
Czekaj, czyli najpierw mam sprawdzić znak spacji, potem wiersza i dopiero potem, czy błąd, czyli .fail() i dopiero wtedy jak to trzecia możliwość to wyczyścić flanke, tak?

Sorry mi to musisz ciutek łopatologiczniej bo z tymi błędami itp to od niedawna robię, zawsze miałem czystą sytuację.
P-100237
« 1 » 2 3 4
  Strona 1 z 4 Następna strona