質問

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.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top