Tôi đang viết một thư viện C đọc tập tin vào bộ nhớ. Nó bỏ qua 54 byte đầu tiên của tệp (tiêu đề) và sau đó đọc phần còn lại dưới dạng dữ liệu. Tôi sử dụng fseek để xác định chiều dài của tập tin, và sau đó sử dụng fread để đọc trong tập tin.Tại sao fread tiếp cận EOF sớm?
Vòng lặp chạy một lần và sau đó kết thúc vì đạt được EOF (không có lỗi). Cuối cùng, bytesRead = 10624, ftell (stream) = 28726 và bộ đệm chứa 28726 giá trị. Tôi mong đợi fread để đọc 30.000 byte và vị trí tập tin được 30054 khi đạt được EOF.
C không phải là ngôn ngữ mẹ đẻ của tôi vì vậy tôi nghi ngờ tôi đã có một sai lầm mới bắt đầu câm ở đâu đó.
Mã là như sau:
const size_t headerLen = 54;
FILE * stream;
errno_t ferrno = fopen_s(&stream, filename.c_str(), "r");
if(ferrno!=0) {
return -1;
}
fseek(stream, 0L, SEEK_END);
size_t bytesTotal = (size_t)(ftell(stream)) - headerLen; //number of data bytes to read
size_t bytesRead = 0;
BYTE* localBuffer = new BYTE[bytesTotal];
fseek(stream,headerLen,SEEK_SET);
while(!feof(stream) && !ferror(stream)) {
size_t result = fread(localBuffer+bytesRead,sizeof(BYTE),bytesTotal-bytesRead,stream);
bytesRead+=result;
}
Tùy thuộc vào tham khảo bạn sử dụng, nó khá rõ ràng rằng việc thêm một "b" để cờ chế độ là câu trả lời. Tìm kiếm các đề cử cho huy hiệu xương đầu. :-)
This reference nói về nó trong đoạn thứ hai, câu thứ hai (mặc dù không có trong bảng của họ).
MSDN không thảo luận cờ nhị phân cho đến nửa chừng dưới trang.
OpenGroup đề cập đến sự tồn tại của thẻ "b", nhưng nói rằng "sẽ không có hiệu lực".
tôi thêm thẻ microsoft từ fopen_s chỉ trong C RTL của MS. – user7116
OpenGroup không đề cập đến nó: r hoặc rb - Mở tệp để đọc. ... Ký tự 'b' sẽ không có hiệu lực, nhưng được cho phép theo tiêu chuẩn ISO C. Vui lòng chỉnh sửa chỉnh sửa của bạn. –
Tôi đã xóa thẻ microsoft. –