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

[C++] Wyswietlanie prawidlowego nr wiersza

Ostatnio zmodyfikowano 2017-07-06 08:19
Autor Wiadomość
kombatdavid123
Temat założony przez niniejszego użytkownika
[C++] Wyswietlanie prawidlowego nr wiersza
» 2017-07-05 18:01:22
Witam, otóż udało mi się zrealizować "trudne" zadanie z Kursu z kontroli błędów, z wyjątkiem jednego szczegółu. Program działa poprawnie natomiast w ostatnim wierszu konsoli wyswietla "Błędne dane w wierszu 4!" zamiast w wierszu 5. Nie rozumiem tego bo przecież informacje o błędzie w wierszu drugim wyświetlane są poprawnie.

C/C++
#include <iostream>
#include <fstream>
#include <string>
#include <windows.h>

using namespace std;

bool czyNapotkanoZnakNowegoWiersza( ifstream & plik );

bool WCZYTAJ_LICZBE( ifstream & PLIK, int & LICZBA );

bool WCZYTAJ_ZNAK( ifstream & PLIK, char & ZNAK );

bool WCZYTAJ_PLIK( string NAZWA_PLIKU );

int main()
{
    if( WCZYTAJ_PLIK( "dane.txt" ) )
         cout << "Udalo sie otworzyc plik !" << endl;
   
    return 0;
}

bool WCZYTAJ_LICZBE( ifstream & PLIK, int & LICZBA )
{
    PLIK.clear();
    PLIK >> LICZBA;
   
    if( PLIK.bad() )
         return false;
   
    if( PLIK.fail() )
         return false;
   
    return true;
}

bool WCZYTAJ_ZNAK( ifstream & PLIK, char & ZNAK )
{
    PLIK.clear();
    PLIK >> ZNAK;
   
    if( PLIK.bad() )
         return false;
   
    if( PLIK.fail() )
         return false;
   
    return true;
}

bool czyNapotkanoZnakNowegoWiersza( 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 WCZYTAJ_PLIK( string NAZWA_PLIKU )
{
    ifstream PLIK;
    PLIK.open( NAZWA_PLIKU.c_str() );
   
    if( !PLIK.good() )
         return false;
   
    int wiersz = 1;
    int liczba;
    int suma = 0;
    char znak;
   
    while( !PLIK.eof() )
    {
        if( WCZYTAJ_LICZBE( PLIK, liczba ) )
        {
            suma += liczba;
        }
        else
        if( WCZYTAJ_ZNAK( PLIK, znak ) )
        {
            suma = 0;
            cout << "Bledne dane w wierszu nr " << wiersz << "!" << endl;
        }
        if( czyNapotkanoZnakNowegoWiersza( PLIK ) )
        {
            wiersz++;
            cout << suma << endl;
            suma = 0;
        }
       
    }
   
    return true;
   
}

PS: Użyłem tych samych danych, które były użyte w kursie
Z góry dziękuje za jakąkolwiek wskazówkę
P-163049
darko202
» 2017-07-06 08:19:27
Twój program nie jest dobry, ponieważ masz trzy funkcje które czytają znak z pliku, a w każdej czytasz znak z pliku. Jeśli przeczytasz coś z pliku to przesuwa się miejsca czytania w pliku.
Kolejna funkcja czyta od nowego miejsca, dlatego funkcja czyNapotkanoZnakNowegoWiersza
nie sprawdza wszystkich znaków nowej linii.

błędem jest, że oczekujesz od pliku, aby miał określona strukturę, a to program powinien rozstrzygnąć jaki ciąg znak został wczytany. 

logika programu powinna być inna
1. czyta ciąg znaków ( np. get )
2. rozstrzyga co to za ciąg znaków
3. sprawdza czy jest zgodność z oczekiwaną struktura pliku
....

przeczytaj i wykorzysta funkcje konwertujące znaki np. atoi, itoa .....

http://cpp0x.pl/dokumentacja​/standard-C/Konwersja-na-liczbe​/237
 


P-163058
« 1 »
  Strona 1 z 1