此函数逐行将两个文件合并到第三个文件中。我测试了它,当它合并时,在第三个结尾处它添加一个空的新行(第一个文件有4行文本,第二个文件有5行)。我怎么摆脱它?谢谢! :)
void fileMerge()
{
FILE *fp1, *fp2, *fp3;
char line1[MAX], line2[MAX];
fp1 = fopen(fileName1, "r");
fp2 = fopen(fileName2, "r");
fp3 = fopen(fileName3, "w+");
while ((!feof(fp1)) && (!feof(fp2)))
{
fgets(line1, MAX, fp1);
if (!feof(fp1))
{
fprintf(fp3, "%s", line1);
}
fgets(line2, MAX, fp2);
if (!feof(fp2))
{
fprintf(fp3, "%s", line2);
}
strcpy(line1, "\0");
strcpy(line2, "\0");
}
fclose(fp1);
fclose(fp2);
fclose(fp3);
printf("\n Files merged...\n");
}
答案 0 :(得分:1)
您将输出文件打开为"w+"
,您不需要+
。
使用feof()
测试文件末尾必然会失败。您应该检查fgets()
的返回值。
strcpy(line1, "\0");
只在line1
的开头复制一个空字节。为此使用line1[0] = '\0';
。
以下是更正后的版本:
void fileMerge(void) {
FILE *fp1, *fp2, *fp3;
char line1[MAX], line2[MAX];
int need_line_feed = 0;
fp1 = fopen(fileName1, "r");
fp2 = fopen(fileName2, "r");
fp3 = fopen(fileName3, "w");
if (fp1 && fp2 && fp3) {
for (;;) {
if (fp1) {
if (fgets(line1, MAX, fp1)) {
if (need_line_feed)
putc('\n', fp3);
fputs(line1, fp3);
need_line_feed = !strchr(line1, '\n');
} else {
fclose(fp1);
fp1 = NULL;
}
}
if (fp2) {
if (fgets(line2, MAX, fp2)) {
if (need_line_feed)
putc('\n', fp3);
fputs(line2, fp3);
need_line_feed = !strchr(line2, '\n');
} else {
fclose(fp2);
fp2 = NULL;
}
}
if (!fp1 && !fp2) {
printf("\n Files merged...\n");
break;
}
}
}
if (fp1) fclose(fp1);
if (fp2) fclose(fp2);
if (fp3) fclose(fp3);
}
它处理file1.txt
或file2.txt
不以换行结束的特殊情况。但是不能正确处理长于MAX-1
个字符的行。为此,使用getc()
和putc()
的替代方法似乎更为可取。
编辑:我实现了您特有的语义:如果file1.txt
和file2.txt
的较长时间,合并后的文件不会以换行结束。
答案 1 :(得分:1)
回到chqrlie的回复:
file1.txt contents:
1)
2)
3)
4)
file2.txt contents:
a)
b)
c)
d)
e)
result.txt contents:
1)
a)
2)
b)
3)
c)
4)d)
e)