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?