説明できない奇妙なバグを見つけたとき、私は 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 バイトと、結果の不可解なものです。10
0D 0A
fwrite
success
5
ftell
ここで一体何が起こっているのか誰か教えてください...そしてなぜ10で、なぜ97または28ではないのですか??
ご助力ありがとうございます!
編集: ちょっと待って、私には考えがあると思います...これは \n が Unix では 0A であり、Windows では 0D 0A であり、コンパイラーの内部機能が相互に変換することに関連していませんか? 必要なバイトを正確に書き込むにはどうすればよいですか?