Funkcja eof

0
	ofstream plikOUT;
	plikOUT.open("dane.bin", ios::binary);

	int x = 11;
	plikOUT.write((const char*)& x, sizeof(x));
	x = 22;
	plikOUT.write((const char*)&x, sizeof(x));
	x = 33;
	plikOUT.write((const char*)&x, sizeof(x));
	x = 44;
	plikOUT.write((const char*)&x, sizeof(x));
	plikOUT.close();

	ifstream plikIN;
	plikIN.open("dane.bin", ios::binary | ios::in);
	int bufor{ 0 };
	while (!plikIN.eof()) {
		plikIN.read((char*)&bufor, sizeof(bufor));
		cout << bufor << endl;
	}

Liczbę 44 wypisuje dwa razy. Dlaczego?

3

Bo eof jest ustawione dopiero po nieudanym odczycie (z powodu końca źródła).

0

Czyli tak?

while (true) {
		plikIN.read((char*)&bufor, sizeof(bufor));
		if (!plikIN.eof()) cout << bufor << endl; else break;
}
1

Dlaczego nie sprawdzisz wyniku read(), tylko bawisz się w jakieś dziwne kombinacje?

0
while (plikIN.read((char*)&bufor, sizeof(bufor))) cout << bufor << endl;
1

W systemie jest wiele strumieni danych o nieznanej długości.
Ergo eof może zwrócić prawdę tylko w momencie, kiedy wielkość strumienia danych jest już znana.
Jednak to może być wiadome długo po fakcie, kiedy wszystkie dane zostały przeczytane.
Z tego właśnie powodu eof zwraca true w momencie, kiedy nastąpi próba czytania poza długość strumienia.
Jeśli danych jeszcze nie ma, to funkcja czytająca blokuje dalsze wykonanie, do momentu pojawienia się danych lub informacji o próbie czytanie poza długość strumienia.

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