1

我正在写一个下载加速器。所以我从网络服务器下载一个文件到 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”的两个文件运行您的函数,它在 output.txt 中产生了正确的输出。

于 2012-07-08T15:17:52.127 回答
2

该函数看起来是正确的(并且 Jari 为您验证了它)。如果您确定您的输入文件不是问题(您说您通过cat *.part在评论中执行 a 进行了验证),那么您可能已将不正确的参数传递给函数调用。

检查filenames提供给函数的数组是否符合您的期望。检查以查看:

  • 文件按您期望的顺序排列
  • 没有“额外”文件或“丢失”文件
  • 每个文件名本身就是您所期望的

检查参数中的文件名数量n是否正确。n请注意,当参数错误时,问题可能看起来像一个额外或丢失的文件或不正确命名的文件。

在您测试通过 using 下载的文件时的评论中cat *.part,使用来查看 shell 为您的命令echo *.part生成的顺序。cat

于 2012-07-08T15:48:35.277 回答