ファイルをメモリに読み込む C ライブラリを作成しています。ファイル (ヘッダー) の最初の 54 バイトをスキップし、残りをデータとして読み取ります。fseek を使用してファイルの長さを判断し、次に fread を使用してファイルを読み取ります。
ループは 1 回実行され、EOF に達したため終了します (エラーなし)。最終的に、bytesRead = 10624、ftell(stream) = 28726 となり、バッファには 28726 個の値が含まれます。EOF に達したとき、fread は 30,000 バイトを読み取り、ファイル位置は 30054 になると予想しています。
C は私の母国語ではないので、どこかで初歩的なミスを犯したのではないかと思います。
コードは次のとおりです。
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;
}
使用するリファレンスによっては、モード フラグに「b」を追加することが答えであることは明らかです。ボーンヘッドバッジのノミネートを募集しています。:-)
このリファレンスでは、2 番目の段落の 2 番目の文でそれについて説明しています (ただし、表にはありません)。
MSDNでは、ページの途中までバイナリ フラグについて説明していません。
OpenGroupは「b」タグの存在について言及していますが、「効果はない」と述べています。