• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zadanie c++ wczytywanie z pliku, kontrola błędów

Cloud VPS
0 głosów
901 wizyt
pytanie zadane 16 lipca 2018 w C i C++ przez Nowacx02 Obywatel (1,060 p.)

Witam robię zadanie z kursu programowanie na stronie cpp0x które brzmi następująco:

2. [trudne zadanie] 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).

Przykładowe dane:

1 2 3
3 4 a 5
3 2
5 2 2 1 3
# 3 4

Oczekiwane standardowe wyjście programu dla przykładowego zestawu danych:

6
Bledne dane w wierszu nr 2!
5
13
Bledne dane w wierszu nr 5!

Wykorzystaj poniższą funkcję do wykrywania znaku przejścia do nowej linii:

bool czyNapotkanoZnakNowegoWiersza( std::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
}

Powyższej funkcji nie wolno modyfikować.

 

Napisałem następujący kod:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

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 wczytajplik(string nazwapliku)
{
 ifstream file;
 file.open(nazwapliku.c_str() );
 if(!file.good() )
 {
     cout<<"Nie udalo sie odczytac pliku";
     return false;
 }
 int wiersz=1;
 int number;
 int suma=0;
 string linia;
    while(!file.eof() )
    {
    file>>number;
    if(file.fail() )
    {
      suma=0;
      cout<<"Bledne dane w wierszu: "<<wiersz<<endl;
      file.clear();
      std::getline( file, linia );
      wiersz++;

    }
    else
    {
        suma+=number;
        if(czyNapotkanoZnakNowegoWiersza(file));
        {
        wiersz++;
        cout<<suma<<" ";
        suma=0;
        }
    }

    }
    file.close();
    return true;

}

int main()
{
    if(wczytajplik("dane.txt") )
        cout<<"Plik odczytano";
    return 0;
}

Jednak w oknie konsoli wyświetla mi się:

1 2 3 3 4 Bledne dane w wierszu: 6
3 2 5 2 2 1 3 Bledne dane w wierszu: 14
Bledne dane w wierszu: 15
Plik odczytano
Process returned 0 (0x0)   execution time : 0.016 s
Press any key to continue.

 

Co może być nie tak w kodzie?

1 odpowiedź

0 głosów
odpowiedź 16 lipca 2018 przez Michał Gibas Pasjonat (19,630 p.)
wybrane 16 lipca 2018 przez Nowacx02
 
Najlepsza
Przy if'ie w 58 linii masz średnik po nim i program źle działa... Powinno to być wyświetlone też w warningach kompilatora do których polecam zaglądać.

Pozdrawiam!
komentarz 16 lipca 2018 przez Nowacx02 Obywatel (1,060 p.)
-------------- Build: Debug in kontrola bledow-zadanie domowe (compiler: GNU GCC Compiler)---------------

mingw32-g++.exe -Wall -fexceptions -g  -c "C:\Users\Koxx69\Desktop\projekty\kontrola bledow-zadanie domowe\main.cpp" -o obj\Debug\main.o
mingw32-g++.exe  -o "bin\Debug\kontrola bledow-zadanie domowe.exe" obj\Debug\main.o   
Output file is bin\Debug\kontrola bledow-zadanie domowe.exe with size 1.53 MB
Process terminated with status 0 (0 minute(s), 0 second(s))
0 error(s), 0 warning(s) (0 minute(s), 0 second(s))
 

0 błędów mi wyświetlało
komentarz 16 lipca 2018 przez Michał Gibas Pasjonat (19,630 p.)
Dziwne ja w g++ 7.3.0 miałem warninga, ale to może przez to że to MinGW ;v

Podobne pytania

0 głosów
1 odpowiedź 2,568 wizyt
pytanie zadane 29 sierpnia 2017 w C i C++ przez Mithriandil Początkujący (250 p.)
0 głosów
2 odpowiedzi 317 wizyt
pytanie zadane 25 stycznia 2017 w C i C++ przez Akiro Bywalec (2,910 p.)
+2 głosów
1 odpowiedź 386 wizyt
pytanie zadane 18 czerwca 2016 w C i C++ przez Sinnley Stary wyjadacz (12,810 p.)

93,485 zapytań

142,417 odpowiedzi

322,765 komentarzy

62,898 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...