我正在编写下载加速器。所以我将网络服务器上的文件下载到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工作并且与原始版本相同。
答案 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
命令生成的顺序。