Podczas wesołego programowania natrafiłem na dziwną rzecz. Chcąc aby pętla zakończyła się wraz z końcem pliku użyłem warunku !plik.eof() . Po włączeniu programu pętla wykonywała się w nieskończoność i program zaciął się. Zmieniłem na plik.good() - to samo. Z problemem się już uporałem bo pierwsza linijka plik zawierała liczbę z ilością osób więc mogłem przypisać ją do inta (po konwersji ze stringa) i na jej podstawie prostym rachunkiem
1 + 2 * ilosclini wyliczyć kiedy pętla ma się skończyć więc wiem, że z plikiem i instrukcjami w pętli wszysko jest ok. Mój nauczyciel z gimnazjum mówił, że błąd zawsze jest po stronie programisty, ale teraz to już zwątpiłem.
Oto dziłający kod :
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <sstream> //Konwersja stringa na int
using namespace std;
struct dane
{
string nazwisko ;
int wplata ;
};
int main()
{
fstream plik ;
plik.open("plik.txt" , ios::in) ;
if (plik.good() == false)
{
cout << "ERROR" << endl << "Wylaczenie awaryjne." << endl ;
exit(0) ;
}
string linia ;
getline(plik , linia) ;
int i ;
istringstream is(linia) ; // Konwersja stringa na int
is >> i ;
dane * tablica = new dane [i] ;
for (int a = 0 ; a < i ; a++)
{
tablica[a].wplata = 0 ;
}
int b = 0 ;
string linijka ;
int x ;
while ( b != i )
{
getline(plik , tablica[b].nazwisko) ;
getline(plik , linijka) ;
x = 0 ;
istringstream iss (linijka) ;
iss >> x ;
tablica[b].wplata = x ;
b++ ;
}
for (int i = 0 ; i < 4 ; i ++ )
cout << tablica[i].nazwisko << endl << tablica[i].wplata << endl ;
plik.close() ;
cout << endl << endl ;
return 0;
}
Wystarczy zamienić b != i na !plik.eof() i się sypie a nie powinno (wedle mojej wiedzy).