Dlaczego fiest osiąga EOF wcześnie?
Piszę bibliotekę C, która wczytuje plik do pamięci. Pomija pierwsze 54 bajty pliku (nagłówek), a następnie odczytuje resztę jako dane. Używam fseek do określenia długości pliku, a następnie używam fread do odczytania pliku.
Pętla działa raz, a następnie kończy się, ponieważ osiągnięto EOF (brak błędów). Na koniec bajtRead = 10624, ftell (strumień) = 28726, a bufor zawiera 28726 wartości. Oczekuję, że fread odczyta 30 000 bajtów, a pozycja pliku 30054, gdy osiągnięty zostanie EOF.
C nie jest moim językiem ojczystym, więc podejrzewam, że gdzieś mam głupi błąd początkującego.
Kod jest następujący:
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;
}
W zależności od użytego odniesienia jest całkiem oczywiste, że dodanie „b” do flagi trybu jest odpowiedzią. Szukam nominacji do odznaki z kości. :-)
To odniesienie mówi o tym w drugim akapicie, drugim zdaniu (choć nie w ich tabeli).
MSDN nie omawia flagi binarnej do połowy strony.
OpenGroup wspomina o istnieniu znacznika „b”, ale stwierdza, że „nie będzie działać”.