0

このコードを書いて、2 つのファイルを結合するテストを行いました。

 long getFileSize(char *filename)
{
     FILE* fp=fopen(filename,"rb");
     fseek(fp,0,SEEK_END);
     long size=ftell(fp); 
     fclose(fp); 
     return size;   
}



 long lengthA = getFileSize(argv[1]);
   long lengthB = getFileSize(argv[2]);
   printf("sizeof %s is:%d\n",argv[1],lengthA);
   printf("sizeof %s is %d\n",argv[2],lengthB);

   void *pa;
   void *pb;
   FILE* fp=fopen(argv[1],"rb");
   fread(pa,1,lengthA,fp);
   fclose(fp);
   FILE* fpn=fopen(argv[2],"rb");
   fread(pb,1,lengthB,fpn);
   fclose(fpn);
   printf("pointerA is:%p;pointerB is:%p\n",pa,pb);

   FILE *ff=fopen("test.pack","wb");
   fwrite(pa,1,lengthA,ff);
   fwrite(pb,1,lengthB,ff);
   fclose(ff);

   long lengthFinal = getFileSize("test.pack");

   printf("Final size:%i\n",lengthFinal);

ただし、データがgetFileSizeからの戻り値と等しいかどうかはわかりません。コンソールの出力には明らかに何か問題があると表示されますが、わかりません。

sizeof a.zip is:465235
sizeof b.zip is 107814
pointerA is:0x80484ec;pointerB is:0x804aff4
Final size:255270

各ファイルの長さを知っているので、 fseek を使用してそれらを復元できますか? それが私が考えていたアイデアです。

4

3 に答える 3

3

*pa*pbファイルの内容が読み込まれるメモリを指す必要があります。

したがって、mallocこれら 2 つのバッファに対してlengthA*sizeof(char)とを使用して a を実行し、lengthB*sizeof(char)これらの割り当てられたバッファを に渡しますfread

pa = malloc(lengthA*sizeof(char));
pb = malloc(lengthB*sizeof(char));
...
fread(pa,sizeof(char),lengthA,fp);
...
fread(pb,sizeof(char),lengthB,fpn);

さらに、fread実際に読み取ったアイテムの数を返します。こちらもチェック!

からの抜粋man fread:

fread()fwrite()は、正常に読み書きされたアイテムの数を返します (つまり、文字数ではありません)。エラーが発生した場合、またはファイルの終わりに達した場合、戻り値は短い項目数 (またはゼロ) です。

于 2011-12-21T11:35:18.640 に答える
2

両方のソース ファイルを一度にメモリにロードする本当の理由はないことに注意してください。また、実際にはすべてのファイルを読み込んでいて、コンテンツを再度書き出すだけなので、メモリ効率が非常に悪い可能性があります。

私の意見では、より良いアルゴリズムは次のようになります。

let C = a reasonable buffer size, say 128 KB
let B = a static buffer of C bytes
let R = the output file, opened for binary write
for each input file F:
  open F for binary read
  repeat
    let N be the number of bytes read, up to a maximum of C
    if N > 0
      write N first bytes of B into R
  until N = 0
  close F
close R

これにより、バッファーを動的に割り当てる必要がなくなりchar C[B]ます#define B (128 << 10)

上記は、配信するバイトがないファイルからの読み取りが 0 バイトを返すことを前提としています。

また、ファイル全体をロードする必要がなくなることで、ファイルのサイズを計算するために最後までシークするためだけに各入力ファイルを余分な時間開く必要がなくなることに注意してください。

于 2011-12-21T12:34:52.720 に答える
1

papb有効なメモリを指していません。

char* pa = malloc(lengthA * sizeof(char));
char* pb = malloc(lengthB * sizeof(char));

free()必要がなくなったら覚えておいてください。

fopen()関数、fread()fwrite()などからのすべての戻り値を確認します。

于 2011-12-21T11:35:44.740 に答える