Gần đây tôi đã gặp phải sự cố do sử dụng fstream :: eof(). Tôi đọc dòng sau từ here:Tại sao std :: fstream đặt bit EOF theo cách của nó?
Hàm eof() trả về true nếu kết thúc tệp đầu vào được kết hợp, sai cách khác.
và (nhầm lẫn) giả định điều này có nghĩa là nếu tôi sử dụng fstream :: read() và đọc phần cuối của tệp, hàm eof() sẽ cho tôi biết. Vì vậy, tôi đã làm một cái gì đó như thế này (rất tổng quát):
for(int i = 0; i < max && !file.eof(); i++)
{
file.read(mything, sizeof(mything));
}
vấn đề này được đưa ra vì những gì được giải thích sau trên trang liên kết ở trên (mà tôi không thể đọc ban đầu, nhờ vào đoạn đầu tiên nhầm lẫn):
Ngược lại, luồng không đi vào trạng thái EOF nếu có bất kỳ khoảng trống nào sau mã thông báo cuối cùng, nhưng cố gắng đọc một mã thông báo khác vẫn không thành công. Do đó, cờ EOF không thể được sử dụng như một phép thử trong một vòng lặp nhằm đọc tất cả các nội dung luồng cho đến EOF. Thay vào đó, người ta nên kiểm tra tình trạng thất bại sau một nỗ lực để đọc.
Vì vậy, tôi đã thay đổi và giờ đây kiểm tra vòng lặp của tôi dựa vào tệp.fail() thay vì tệp.eof() và tôi hiểu CÁCH eof() hoạt động. Câu hỏi của tôi là, tại sao nó lại hoạt động theo cách đó? Có những tình huống mà điều này là mong muốn không? Dường như với tôi rằng một khi bạn đã vượt qua EOF, bạn đã vượt qua EOF và eof() sẽ trở lại đúng sự thật.
CẬP NHẬT Cảm ơn bạn đã trả lời, tôi nghĩ mình đã hiểu. Hoạt động duy nhất tôi đang thực hiện là đọc(), và tôi ngay lập tức kiểm tra thất bại(), vì vậy tôi nghĩ rằng tôi không sao. Bây giờ, câu hỏi của tôi là, những gì sẽ Tôi sử dụng eof() cho?
cho (int i = 0; i