Cześć, uczę się c++ robiąc jeden z kursów Online.
Mam oto takie 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:
C/C++
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() )
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() )
return false; //wystąpił błąd odczytu danych
if( cZnak == '\n' )
return true;
} //for
}
Powyższej funkcji nie wolno modyfikować.
Link do zadania:
http://cpp0x.pl/kursy/Kurs-C++/Poziom-4/Wczytywanie-zawartosci-pliku-a-kontrola-bledow/485
Mój kod:
#include <iostream>
#include <fstream>
using namespace std;
bool czyNapotkanoZnakNowegoWiersza( ifstream & plik )
{
char cZnak;
for(;; )
{
plik.clear();
cZnak = plik.peek();
if( plik.fail() )
return false;
if( !isspace( cZnak ) )
return false;
plik.get( cZnak );
if( plik.fail() )
return false;
if( cZnak == '\n' )
return true;
}
}
bool odczytajPlik(string nazwaPliku) {
ifstream plik;
plik.open(nazwaPliku.c_str());
if (!plik.good()) {
cout << "Nie udalo sie otworzysc pliku";
return false;
}
int suma = 0;
int liczba;
int wiersz=1;
string linia;
while (1) {
int liczba;
char cZnak;
plik >> liczba;
if( !plik.fail() ) {
suma += liczba;
if(czyNapotkanoZnakNowegoWiersza(plik)){
wiersz++;
cout << suma << endl;
suma=0;
}
}
else
{
if( plik.bad() )
return false; //wczytanie liczby nie powiodło się z powodu poważnego błędu
plik.clear();
plik >> cZnak;
if( !plik.fail() ) {
suma=0;
cout << "Bledne dane w wierszu " << wiersz << "!" << endl;
plik.clear();
wiersz++;
}
else
{
if( plik.eof() )
break;
return false; // wczytanie znaku powinno zawsze się udać, chyba że skończyły się dane
} //if
} //if
} //while
plik.close();
return true;
}
int main() {
if( !odczytajPlik( "Odczyt.txt" ) )
cout << "Plik nie zostal otwarty" << endl;
return 0;
}
A oto co dostaje:
6
Bledne dane w wierszu 2!
5
5
13
Bledne dane w wierszu 6!
Widziałem rozwiązanie ze wstawieniem getlina lecz chciałbym to napisać bez użycia getlina