Jak odczytać plik strumieniowo nie dublując ostatniej linijki?

0

Jak poprawnie odczytać dane korzystając ze strumieni z pliku tekstowego w pętli while tak, żeby ostatni wiersz się nie dublował?

Napisałem prosty program:

#include <iostream>
#include <fstream>
#include <cstdlib>

using namespace std;

int main() {
	ifstream in;

	in.open("test.txt");
	if(!in.is_open()) {
		cerr << "Nie można otworzyć pliku test.txt do odczytu!" << endl;
		return EXIT_FAILURE;
	}

	int n;
	while(!in.eof()) {
		in >> n;
		cout << n << endl;
	}

	in.close();
	return EXIT_SUCCESS;
}

W pliku test napisałem 3 liczby. Każda w nowym wieszu. W ostatnim (trzecim) wierszu jest tylko liczba bez przejścia do nowej linii. Jak dam Enter to nic nie zmienia. Jak zamienię pętlę while na do while to również nic to nie zmienia.
Jako wynik oczekiwałbym żeby na ekranie pojawiły się również trzy liczby każda w nowym wierszu. Lecz dzieje się tak, że ostatnia liczba się dubluje. Nie wiem dlaczego i jak temu zaradzić.
Jak poprawić kod, żeby ostatnia linijka w pliku test.txt się nie dublowała?

1
while(file >> n){ /* baw sie dobrze */ }
1

Standardowy sposób to:

while(stream >> data) {
  // ...

Np. http://ideone.com/fVQb5T

0

Działa dziękuję. A moglibyście wytłumaczyć dlaczego sposób z funkcją sprawdzającą koniec pliku in.eof() nie działa tak jak oczekiwałbym?

0

Bo eof jest ustawiane dopiero, kiedy spróbujesz przeczytać poza koniec pliku.

Kiedy przeczytasz ostatnią linijkę eof nie jest ustawione. Później w kolejnym obiegu pętli próbujesz czytać znów, ale to się nie udaje. Ustawiane jest eof, a wartość n nie jest zmieniana. Wypisuje się więc wartość n z poprzedniego obiegu pętli. Kolejny obieg już się nie wykonuje bo eof jest ustawione.

1 użytkowników online, w tym zalogowanych: 0, gości: 1