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: #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
|
|
pekfos |
» 2013-12-26 15:56:14 Nie sprawdzasz (poprawnie) eofa. Doczytaj w dokumentacji, kiedy i z czym jest on ustawiany. |
|
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. |
|
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. |
|
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ę. |
|
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. |
|
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. |
|
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ę. |
|
« 1 » 2 3 4 |