30

ファイルをメモリに読み込む 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」タグの存在について言及していますが、「効果はない」と述べています。

4

3 に答える 3

56

おそらくそれはバイナリモードの問題です。"r+b"モードとしてファイルを開いてみてください。

編集:コメントに記載されているように、読み取り/書き込み用に開き、読み取り専用であるため"rb"、元の意図により適している可能性があります。"r+b""rb"

于 2008-10-02T19:04:41.193 に答える
0

また、binmode.obj をリンク コマンドに含めるだけで、すべてのファイルを開くことができます。

于 2008-10-02T20:00:01.450 に答える