2

説明できない奇妙なバグを見つけたとき、私は BMP ファイルをゼロから作成する実験をしていました。このミニマリスト プログラムのバグを分離しました。

int main()
{
    FILE* ptr=NULL;
    int success=0,pos=0;
    ptr=fopen("test.bin","w");
    if (ptr==NULL)
    {
        return 1;
    }
    char c[3]={10,11,10};
    success=fwrite(c,1,3,ptr);
    pos=ftell(ptr);
    printf("success=%d, pos=%d\n",success,pos);
    return 0;
}

出力は次のとおりです。

success=3, pos=5

test.binファイルの16進ダンプは次のとおりです。

0D 0A 0B 0D 0A

11つまり、 (0x0B)の代わりにどんな値を入れてもfwrite、正しく書き込まれます。しかし、なんらかの理由で、 (0x0A) と正確にこの値にfwrite遭遇すると、代わりに、つまり 2 バイトを書き込みますが、引数で書き込みごとに 1 バイトを明確に指定しました。したがって、変数に見られるように、書き込まれた 3 バイトと、結果の不可解なものです。100D 0Afwritesuccess5ftell

ここで一体何が起こっているのか誰か教えてください...そしてなぜ10で、なぜ97または28ではないのですか??

ご助力ありがとうございます!

編集: ちょっと待って、私には考えがあると思います...これは \n が Unix では 0A であり、Windows では 0D 0A であり、コンパイラーの内部機能が相互に変換することに関連していませんか? 必要なバイトを正確に書き込むにはどうすればよいですか?

4

2 に答える 2

9

ファイルがテキスト モードで開かれたため、CRLF 変換が行われています。試す:

fopen("test.bin","wb");
于 2013-08-30T12:57:56.870 に答える
3

Windows マシンで作業している必要があります。Windows では EOL は CR-LF ですが、Unix では 1 文字です。システムは 0A を 0D0A に置き換えています。

于 2013-08-30T12:57:50.120 に答える