16
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

何が起こっている?writeは25755に設定されており、fwriteに、最初にあるファイルにその数のバイトを書き込み、次に25755以外の位置にimを書き込むように指示します。

4

4 に答える 4

29

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
于 2009-10-19T00:18:05.417 に答える
4

ファイルを開いたモードによって異なる場合があります。テキストファイルとして開くと、DOS/Windowsシステムの\nように記述される場合があります。\r\nただし、ftello64()おそらくバイナリファイルポインタのみを提供します。これは、\r書き込まれた余分な文字をカウントします。データをクリアするoutbuf[]\n、outファイルを("wb"ではなく"w")バイナリとして開いてみてください。

于 2009-10-19T00:21:08.657 に答える
2

変数writeは初期化されていないため、配列のサイズと書き込まれる量は基本的にランダムになります。

于 2009-10-19T00:32:36.083 に答える
0

面白い。ftello64に置き換えられますが、WindowsVC++では正常に動作しftellます。

于 2009-10-19T00:28:22.557 に答える