2

ファイルの最後のバイトが control-z (MS-DOS のファイル終了バイト - 0x1A)であるかどうかを検出しようとしていますが、成功していません。私は使用しています

fseek(filePointer,-1,SEEK_END);

最後のバイトを分離してから使用しています

fread(buffer, sizeof(buffer[0]), sizeof(custom_char), filePointer);

最後のバイトを読み取ろうとします。

そのバイトを読み取ろうとすると、基本的にゴミが発生します.freadがデフォルトで 0x1A バイトを無視するのか、それともこれを行っている間に過去に遭遇した他の風変わりな動作があるのか​​ 疑問に思っています.

誤動作している現在のロジックは、最後のバイトを読み取ろうとしており、fread が 0 を返した場合に見つかったファイル マーカーの終わりを考慮しています (fread は読み取った要素の数を返す必要がありますよね?)。

if(fread(buffer, sizeof(buffer[0]), sizeof(custom_char), filePointer) == 0)
{
    // strip off the last byte
}

編集: fopen が呼び出され、BOM が書き込まれ、BOM の 3 番目のバイトが誤って 0xA1 エンド オブ ファイル マーカーと見なされて取り除かれた後に、私が抱えている問題が発生することを追加する必要があります。

4

1 に答える 1

3

バイナリ モードでファイルを開く必要があります。

FILE *filePointer = fopen("yourfile.txt", "rb");

それ以外の場合、ファイルはテキスト モードで開かれ、Windows/MSDOS では CR-LF 文字ペアが C '\n' 文字に変換され、EOF 文字が取り除かれます。

于 2012-11-19T20:08:53.203 に答える