30/09/2018, 17:16

Sử dụng hàm eof() khi thao tác file trong C bị lặp lại giá trị

file number.bin chỉ chứa 1 số nhưng khi dùng đoạn code dưới in ra thì in ra tới 2 số. Ai giải thích giúp mình với.

#include <iostream>
#include <fstream>

using namespace std;
int main() 
{
	ifstream inBinFile("numbers.bin", ios::binary | ios::in);
	float number;
	while (!inBinFile.eof()) {
		inBinFile.read((char *)&number, sizeof(number));
		cout << number << endl;
	}
}
viết 19:24 ngày 30/09/2018

do khi đọc hết (ví dụ) 4 bytes cho number rồi thì vẫn chưa thấy eof, phải mất 1 vòng lặp nữa mới thấy eof. Mà khi đọc thêm 1 lần nữa như vậy giá trị number ko thay đổi vì ko đọc được giá trị nào nên ở vòng lặp thừa này in ra giá trị y như giá trị cuối cùng.

đừng bào giờ xài eof. Sửa lại là

while ( inBinFile.read((char*)&number, sizeof(number)) )
{
    cout << number << endl;
}

giải thích: hàm istream::read() trả về istream&, là chính istream gọi hàm read() này. istream có thể hiểu là boolean, trả về true nếu istream đọc ko bị lỗi, trả về false nếu istream đọc bị lỗi. Lỗi này có thể là bad, fail, hoặc eof. Ở đây đọc tới hết inBinFile thì flag eof sẽ được set cho inBinFile, làm inBinFile có thể hiểu là boolean false, kết thúc vòng lặp, ko in ra giá trị thừa cuối cùng nữa.

viết 19:33 ngày 30/09/2018

cám ơn b nhé…

time viết 19:26 ngày 30/09/2018

thanks
mình cũng bị lỗi này mà k hiểu tại sao

Bài liên quan
0