なぜFWRITEは私が言った以上に書いているのですか?
質問
FILE *out=fopen64("text.txt","w+");
unsigned int write;
char *outbuf=new char[write];
//fill outbuf
printf("%i\n",ftello64(out));
fwrite(outbuf,sizeof(char),write,out);
printf("%i\n",write);
printf("%i\n",ftello64(out));
出力:
0
25755
25868
何が起こっている?書き込みは25755に設定されており、FWRITEに、最初のファイルに多くのバイトを書くように言い、25755以外の位置にいますか?
解決
濃いシステム(たとえば、Windows)に携わっていて、ファイルがバイナリモードで開かれていない場合、行の端が自動的に変換され、各「ライン」が1バイトを追加します。
したがって、指定します "wb"
単にではなくモードとして "w"
@cafが指摘するように。それは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 y.c Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. y.c Microsoft (R) Incremental Linker Version 9.00.21022.08 Copyright (C) Microsoft Corporation. All rights reserved. /out:y.exe C:\Temp> y.exe 04
Cygwin GCCと:
/cygdrive/c/Temp $ gcc y.c -o y.exe /cygdrive/c/Temp $ ./y.exe 02
他のヒント
ファイルを開いたモードに依存する場合があります。テキストファイルとして開くと、 \n
と書かれているかもしれません \r\n
DOS/Windowsシステムで。でも、 ftello64()
おそらく、バイナリファイルポインターのみを与えるだけで、それは追加でカウントされます \r
書かれたキャラクター。をクリアしてみてください outbuf[]
任意の \n
データまたはバイナリとしてoutファイルを開いてみてください("wb"
それ以外の "w"
).
変数 write
非初期化されているため、配列のサイズと記述された量は本質的にランダムになります。
面白い。ではあるが、Windows VC ++では正常に動作します ftello64
交換された ftell
.
所属していません StackOverflow