Problema pe care ai intalnit-o folosind solutia
while(!f.eof())
{
...
}
(cand iti gasea 4 randuri in loc de 3 si citeai 0), nu era de fapt o problema. E normal sa se intample asa.
functia eof() (ca si feof() din libraria C) intoarce true daca ultima citire din stream nu a reusit din cauza de end of file.
Nu ca urmatoarea citire din fisier va cauza end of file (cum se intampla, de exemplu in Pascal).
Adica, in cazul nostru, indicatorul EOF al stream-ului este setat de catre o citire din stream care a ajuns la "end of file".Prima data se face citirea care a ajuns la "end of file", abia dupa aceea indicatorul EOF al stream-ului devine setat (tocmai din cauza ca ultima citire a ajuns la "end of file").
Ceea ce se intampla in cazul tau este ca foloseai ultima valoare pe care ai citit-o cu succes (aceasta fiind 0), dupa ce citisei deja peste "end of file".
Sa exemplific:- Am urmatorul fisier de intrare, test.txt (nu are nici un new-line la sfarsit):
100 200
300 400
500 600
Si urmatorul program:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
ifstream f("test.txt", ios::in);
int value;
while (!f.eof())
{
f >> value;
//if (f.eof())
// break;
cout << value << endl;
}
return 0;
}
Programul isi propune sa citeasca fiecare numar din fisierul "test.txt" si sa il afiseze pe consola.
Daca il execut, obtin urmatoarele:
100
200
300
400
500
600
600
Precum se vede, se afiseaza valoarea 600 de 2 ori. De ce ? Dupa ce am citit ultima valoare din fisier, si urmeaza sa iterez din nou prin bucal "while", eof() nu intoarce true. La ultima iteratie, fac o citire din fisier care nu reuseste si indicatorul EOF al stream-ului devine setat. Dar eu am verificat indicatorul de EOF al stream-ului
doar la inceputul buclei "while", cand inca nu era setat. Numai fac nici o verificare ca el a fost setat tocmai in urma ultimei citiri
Astfel ajung sa folosesc ultima valoare citita cu succes
de doua oriCum sa repar acest bug ?
Se decomenteza liniile:
//if (f.eof())
//break;
Rezultatul rularii pentru programul modificat este:
100
200
300
400
500
600
Acum functioneaza pentru ca eu testez ca nu cumva citirea din fisier a fost peste "end of file", inainte sa folosesc ceea ce am citit.