Lekcja 34 - wczytywanie liczb z pliku
Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Zarejestruj się!

Lekcja 34 - wczytywanie liczb z pliku

AutorWiadomość
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
» 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
» 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
» 2018-12-06 18:51:54
Pokaż kod.
P-173128
» 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
» 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
» 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
» 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 2Następna strona