1

ダウンロードアクセラレータを書いています。したがって、Web サーバーからファイルを n 個の部分にダウンロードします。ここで、ファイルを 1 つのファイルにマージしたいと考えています。そこで、次のコードを使用します。また、ファイル名は正しい順序になっています。しかし、取得している出力ファイルは、元のダウンロード ファイルとは異なります。エラーがどこにあるのか教えていただけますか?C

int cbd_merge_files(const char** filenames, int n, const char* final_filename) {

  FILE* fp = fopen(final_filename, "wb");

  if (fp == NULL) return 1;

  char buffer[4097];

  for (int i = 0; i < n; ++i) {

    const char* fname = filenames[i];

    FILE* fp_read = fopen(fname, "rb");

    if (fp_read == NULL) return 1;

    int n;

    while ((n = fread(buffer, sizeof(char), 4096, fp_read))) {

        int k = fwrite(buffer, sizeof(char), n, fp);

        if (!k) return 1;
    }
    fclose(fp_read);

 }

 fclose(fp);

 return 0;
}

さらにいくつかの詳細を追加します。「cat *.part > final.dmg」を実行でき、final.dmg が機能し、元と同じであるため、エラーはパーティショニングにはありません。

4

2 に答える 2

5

あなたの関数は私にとってはうまくいくように見えるので、この関数の入力ファイルに問題がある可能性があります。一般に、出力にこの種の問題が発生した場合は、各関数を個別にテストして、問題の正確な場所を特定する価値があります。そこにある関数は、それ自体で簡単にテストできます。たとえば、次のようになります。

int main(int argc, const char** argv)
{
  cbd_merge_files(argv+1, argc-1, "output.txt");
  return 0;
}

「123」と「321」を含む2つのファイルで関数を実行しようとしましたが、output.txtに正しい出力が生成されました。

于 2012-07-08T15:17:52.127 に答える
2

関数は正しいように見えます (Jari が検証してくれました)。入力ファイルが問題ではないことが確実な場合 (cat *.partコメントで a を実行して確認したと述べています)、関数呼び出しに間違った引数を渡した可能性があります。

filenames関数に提供された の配列が期待どおりであることを確認してください。次のことを確認してください。

  • ファイルは期待どおりの順序になっています
  • 「余分な」ファイルや「不足している」ファイルはありません
  • 各ファイル名自体はあなたが期待するものです

nパラメータ内のファイル名の数も正しいことを確認してください。nパラメータが間違っている可能性がある場合、問題は、余分なファイルまたは不足しているファイル、または不適切な名前のファイルのように見える場合があることに注意してください。

を使用してダウンロードしたファイルをテストしたときのコメントcat *.partで、 を使用echo *.partして、コマンドに対してシェルによって生成されている順序を確認しますcat

于 2012-07-08T15:48:35.277 に答える