Tôi có đoạn mã này trong một chương trình (trong Visual Studio 2005):
if(_eof(fp->_file))
{
phá vỡ;
}
Khi đạt tới eof, nó sẽ phá vỡ vòng khép kín. Nhưng chương trình không thể phân tích được vài nghìn ký tự cuối cùng trong tệp. Vì vậy, để tìm hiểu chuyện gì đang xảy ra, tôi đã làm điều này:
if(_eof(fp->_file))
{
cout<<><>
phá vỡ;
}
Bây giờ câu trả lời tôi nhận được từ ftell khác (và nhỏ hơn) so với kích thước tệp thực tế (điều này không nằm ngoài dự kiến). Tôi nghĩ Windows có thể có vấn đề với tệp nên tôi đã làm như sau:
if(_eof(fp->_file))
{
cout<<><>
fseek(fp, 0, SEEK_END);
cout<<><>
phá vỡ;
}
Chà, fseek() đã đưa ra câu trả lời đúng (bằng kích thước tệp) và ftell() ban đầu không thành công (như đã đề cập).
Bất cứ ý tưởng những gì có thể xảy ra ở đây?
biên tập:Tệp được mở ở chế độ "rb".
Bạn không thể sử dụng một cách đáng tin cậy _eof()
từ TÀI LIỆU*
trên bộ mô tả tập tin thu được vì TÀI LIỆU*
Luồng được đệm. điều này có nghĩa fp
hútfp->_file
Làm khô và lưu trữ các byte còn lại vào bộ đệm bên trong của nó. cuối cùngfp->_file
ở vị trí eof, trong khifp
Vẫn còn byte để bạn đọc. sử dụng feof()
hiện hữu Sau thao tác đọc, hãy xác định xem bạn có ở cuối tệp hay không, nếu bạn trộn các cặp TÀI LIỆU*
Các hàm hoạt động trên bộ mô tả tệp số nguyên, hãy cẩn thận với các hàm hoạt động trên bộ mô tả tệp số nguyên.
Tôi là một lập trình viên xuất sắc, rất giỏi!