使用C程序合并n个文件

时间:2012-07-08 14:51:45

标签: c

我正在编写下载加速器。所以我将网络服务器上的文件下载到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&gt; final.dmg”并且final.dmg工作并且与原始版本相同。

2 个答案:

答案 0 :(得分:5)

你的功能对我来说似乎没问题,所以很可能问题出现在这个函数的输入文件中。通常,如果在输出中遇到此类问题,则值得单独测试每个函数以找出问题的确切位置。你在那里的功能很容易测试,例如:

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

我尝试使用两个文件运行你的函数&#34; 123&#34;和&#34; 321&#34;在它们中,它在output.txt中生成了正确的输出。

答案 1 :(得分:2)

该功能看起来正确(Jari为您验证了它)。如果您确定输入文件不是问题(您在评论中通过cat *.part验证了这一点),那么您可能已经将错误的参数传递给函数调用。

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

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

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

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