0

私のプロジェクトでは、共有ファイルを共有というディレクトリにコピーする必要があります。私の考えは、このファイルの内容を fgets と fputs を使用してコピーすることです。

FILE *fp;
int size;
char *fileBuff

fseek(fp,0,SEEK_END );
size=ftell(fp);
printf("Size of %s: %d bytes.\n",path,size); // print correct size 
fileBuff=malloc(size); // mallocate the file buffer
printf("\nsize of file buffer is %d",sizeof(fileBuff)); //always print 4!!
while(!feof(fp)){
    fgets(fileBuff,size,fp); // put into file buffer

}
printf("\nsize of file buffer is %d",sizeof(fileBuff)); // also print 4!!

ただし、ファイル バッファーを不適切に割り当てることはできません。このファイル バッファーのサイズは常に 4 です。

更新:誤解があるようです。ファイルバッファに何かが保存されているかどうかを確認するためだけの場合は、 sizeof() 。strlen(fileBuff) を試してみると、常に 1 になります。

4

5 に答える 5

4

これは間違っています: sizeof(fileBuff). これがポインターのサイズになり、システムでは 4 になります。

sizeofによって返されるメモリ ブロックのサイズを「抽出」するために を使用することはできませんmalloc()そのサイズを抽出するために何も使用することはできません。(標準) C では単に不可能です。size値、つまり への引数を使用する必要がありますmalloc()

また、ftell()return long、 not int、および両方malloc()とさまざまな I/O 呼び出しが失敗する可能性があるため、考慮する必要があります。

私の意見では、単純なコピーを行うためにファイルのサイズのバッファーを使用するのは得策ではありません。「合理的な」バッファ (正確な最適サイズは多くの要因に依存します) を使用してから、ファイル全体をストリーミングするまでループ内で読み取りと書き込みのペアを繰り返す方がはるかに優れています。

UPDATEあなたのコードに関するさらなるポイント:

  1. あなたは使用について話しますstrlen()が、コードはsizeofの後fread()にも表示されます。
  2. バッファに何かがあるかどうかを「チェック」するために使用することについて話しますsizeofが、これは不可能です。を持つ式sizeofは常にコンパイル時に評価されます1。そのような動的なものをチェックするために使用することはできません。また、これを使用して、 によって返されるメモリ ブロックのサイズを計算することはできませんmalloc()
  3. ファイル データを保持しているバッファでの使用 strlen()は、ファイルがバイナリで最後の位置に '\0' が含まれている場合にのみ確実に機能しますstrlen()
  4. 先ほど言ったように、要求されたメモリ ブロックの割り当てに失敗した場合に、 がmalloc()返されるかどうかを確認する必要があります。NULL

1 C99 の柔軟な配列を除きますが、それは無視しましょう。

于 2012-04-13T09:18:00.507 に答える
2

99 人の開発者が、ポインターのサイズを取得していると回答します。コードを見る必要さえありません。

于 2012-04-13T09:19:18.400 に答える
0

char *(32 ビット) プラットフォームのポインター ( ) のサイズは常に 4 です。

sizeofを使用して、バッファーに割り当てられたメモリの量を判断することはできません。

ポインタが割り当てられているかどうかを確認するには、次の戻り値を確認しますmalloc()

fileBuff = malloc(size);

if (fileBuff == 0) {
   fprintf(stderr, "Error allocating %d bytes.\n", size);
   abort();
}
于 2012-04-13T09:18:12.057 に答える
0

sizeofはコンパイル時に評価されます。これは、コンパイラが 4 バイトであると計算し (ポインタのサイズがプラットフォームで 4 バイトであるため)、それを出力することを求めているためsizeofです。あなたがしたことは とは何の関係もありません。filebufchar*mallocsizeof

于 2012-04-13T09:20:15.193 に答える
0

sizeof()の不適切な使用とは別に、さらに 2 つの考えを検討できます。

ファイルをコピーするだけの場合: 車輪を再発明しようとせず、system()関数を使用して、そのために設計された OS プログラムを呼び出します ( unix ではcp、DOS/Windows ではcopy )。

それがトレーニング目的であり、そのために自分でそれを行うことを主張する場合: ファイル全体を読み込んでから再度書き出すのではなく、チャンクごとに読み書きしてください。大きなバッファ サイズを使用すると、CPU キャッシュが無価値になるだけです。通常、ファイル システムのバッファ サイズまたはその単純な分数に一致させると、グート チャンク サイズになるため、擬似コードは次のようになります。

open input file for reading
open output file for writing
as long as read from input file BUFSIZE bytes and read bytes > 0
     do write read data to output file
close input file
close output file

(そして、I/O ルーチンを呼び出すたびに I/O エラーをチェックすることを忘れないでください!)

最後の注意: fgets()は、常にプレーン テキスト ファイルであることが確実でない限り使用しないでください。fread()/fwrite()を使用することを選択した場合は、たとえそれがバイナリ ファイルであっても保存されます (さらに高速です)。

于 2012-04-13T10:05:00.413 に答える