合并两个文件,为什么最后添加一个新行? C编程

时间:2015-12-13 19:36:05

标签: c file merge line

此函数逐行将两个文件合并到第三个文件中。我测试了它,当它合并时,在第三个结尾处它添加一个空的新行(第一个文件有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");
}

2 个答案:

答案 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.txtfile2.txt不以换行结束的特殊情况。但是不能正确处理长于MAX-1个字符的行。为此,使用getc()putc()的替代方法似乎更为可取。

编辑:我实现了您特有的语义:如果file1.txtfile2.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)