DOSishシステム(たとえば、Windows)を使用していて、ファイルがバイナリモードで開かれていない場合、行末は自動的に変換され、各「行」に1バイトが追加されます。
したがって、@ cafが指摘するよう"wb"
にではなく、モードとして指定します。"w"
Unixライクなプラットフォームには影響せず、他のプラットフォームでも正しい動作をします。
例えば:
#include <stdio.h>
#define LF 0x0a
int main(void) {
char x[] = { LF, LF };
FILE *out = fopen("test", "w");
printf("%d", ftell(out));
fwrite(x, 1, sizeof(x), out);
printf("%d", ftell(out));
fclose(out);
return 0;
}
VC ++の場合:
C:\ Temp> cl yc
Microsoft(R)32ビットC /C++最適化コンパイラバージョン15.00.21022.08for80x86
Copyright(C)MicrosoftCorporation。全著作権所有。
yc
Microsoft(R)インクリメンタルリンカーバージョン9.00.21022.08
Copyright(C)MicrosoftCorporation。全著作権所有。
/out:y.exe
C:\ Temp> y.exe
04
Cygwin gccの場合:
/ cygdrive / c / Temp $ gcc yc -o y.exe
/ cygdrive / c / Temp $ ./y.exe
02