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

Lekcja 34 - wczytywanie liczb z pliku

Ostatnio zmodyfikowano 2018-12-06 21:44
Autor Wiadomość
marcinpro
Temat założony przez niniejszego użytkownika
Lekcja 34 - wczytywanie liczb z pliku
» 2018-02-11 21:54:58
Rozwiązywałem zadanie z lekcji 34.

"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)."

Nie rozumie co robi tutaj linijka getline(plik, linie);
Bo program nie działał mi prawidłowo jak miałem zamiast tego plik.get(); dobrze liczył gdzie sa linie, ale zliczał mi drugi wiersz. Poszukałem porad i znalazłem podobny tylko z getline. Poprostu zapisuje taki spam do zmiennej string jak był bład?

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

using namespace std;

bool czy( 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 odczytwierszy( ifstream & plik )
{
    string linie;
    int wiersz = 1;
    int liczba = 0;
    int suma = 0;
    plik.clear();
    while( !plik.eof() )
    {
        plik >> liczba;
        suma += liczba;
        if( plik.fail() )
        {
            cout << "Napotkano blad w wierszu nr." << wiersz << endl;
            plik.clear();
            getline( plik, linie );
            suma = 0;
           
        } //if
        else
        {
            if( czy( plik ) )
            {
                cout << suma << endl;
                wiersz++;
                suma = 0;
            }
        }
       
       
    } // while
   
}

void odczytajplik( string nazwa )
{
    ifstream plik;
    plik.open( nazwa.c_str() );
    if( !plik.good() )
    {
        cout << "Nie udalo sie wczytac pliku!" << endl;
    } else
    {
        cout << "Plik wczytano poprawenie!" << endl;
        odczytwierszy( plik );
    }
}

int main()

{
    odczytajplik( "c:\\2zad34.txt" );
   
    return 0;
}
[ cpp ]
P-169370
YooSy
» 2018-02-12 07:40:24
Funkcja getline doczytuje dane do końca wiersza od miejsca wystąpienia błędu odczytu danych. Nigdzie więcej program nie używa zmiennej linie.
Zamiast dodatkowej zmiennej i funkcji getline można użyć ignore dla strumienia plikowego.
P-169373
rosa
» 2018-12-06 16:38:27
YooSy, zamienilem getline na plik.ignore i teraz program wyswietla mi dodatkowo znak "5" ktory znajduje sie na koncu niepoprawnego wiersza, przy getlinie program dziala dobrze tyle ze tak jak zostalo wpsomniane wyzej, nie jest to nigdzie uzywana zmienna "linie", ona tylko przechowuje dane po błędzie,
P-173122
YooSy
» 2018-12-06 18:51:54
Pokaż kod.
P-173128
rosa
» 2018-12-06 19:24:46
C/C++
#include "pch.h"
#include <string>
#include <iostream>
#include <fstream>

using namespace std;

bool czy( 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 odczytwierszy( ifstream & plik )
{
    string linie;
    int wiersz = 1;
    int liczba = 0;
    int suma = 0;
    plik.clear();
    while( !plik.eof() )
    {
        plik >> liczba;
        suma += liczba;
        if( plik.fail() )
        {
            cout << "Napotkano blad w wierszu nr." << wiersz << endl;
            plik.clear();
            plik.ignore(); // to zmienilem z getline(plik, linie)
            suma = 0;
           
        } //if
        else
        {
            if( czy( plik ) )
            {
                cout << suma << endl;
                wiersz++;
                suma = 0;
            }
        }
       
       
    } // while
   
}

void odczytajplik( string nazwa )
{
    ifstream plik;
    plik.open( nazwa.c_str() );
    if( !plik.good() )
    {
        cout << "Nie udalo sie wczytac pliku!" << endl;
    } else
    {
        cout << "Plik wczytano poprawenie!" << endl;
        odczytwierszy( plik );
    }
}

int main()

{
    odczytajplik( "c:\\2zad34.txt" );
   
    return 0;
}
P-173132
pekfos
» 2018-12-06 19:27:53
C/C++
plik.ignore(); // to zmienilem z getline(plik, linie)
To pomija jeden znak.
» Kurs C++ » Poziom 1Obsługa strumienia wejściowego lekcja
P-173133
rosa
» 2018-12-06 19:47:55
problem polega na tym ze z plik.ignore() program dziala ale wyswietla mi się ostatni znak z drugiego wiersza z pliku tekstowego i nie jest to poprawne działanie, natomiast z getline(plik, linie) ten znak sie nie wyswietla i cały program dziala dobrze, zadanie drugie zostaje rozwiazane poprawnie pomimo tego ze zmienna string linie nie jest nigdzie uzywana tylke w niej sa zapisane smieci.
P-173134
pekfos
» 2018-12-06 19:53:31
Bo nie wystarczy użyć ignore() bez żadnych argumentów.
» Kurs C++ » Poziom 1Obsługa strumienia wejściowego lekcja
P-173135
« 1 » 2
  Strona 1 z 2 Następna strona