将两个有序文本文件合并到另一个中而不破坏C中的顺序

问题描述 投票:0回答:1

我有两个文本文件;

Andrew Hall
Arnold Price
Shelley Baker

和,

Arnold Hill
Veronica Clay

如你所见,他们是订购的。我需要将它们组合成另一个再次订购的文本文件。所以,预期产出是;

Andrew Hall
Arnold Hill
Arnold Price 
Shelley Baker
Veronica Clay

但是,输出显示为;

Andrew Hall
Arnold Hill
Arnold Price

我想不知怎的,我丢失了两个文件的最后一行,fsort1和fsort2都到达了他们文件的末尾。我怎样才能找到一般解决方案?我究竟做错了什么?

我的代码就是这样;

fgets(name1, 100, fsort1); 
fgets(name2, 100, fsort2);

while(!feof(fsort1) || !feof(fsort2)){
    if(strcmp(name1, name2)<0){
        fprintf(foutput, "%s", name1);
        fgets(name1, 100, fsort1);
    }
    else{
        fprintf(foutput, "%s", name2);
        fgets(name2, 100, fsort2);
    }
}

谢谢。

c file text merge
1个回答
1
投票

我想不知怎的,我丢失了两个文件的最后一行,fsort1和fsort2都到达了他们文件的末尾。

是的,你是。注释已经指出了wrong use of feof,但是如果你的循环因为只有一个文件结束而停止,你就不会继续读取另一个文件了。你可以使用这样的东西:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main(void)
{
    FILE *fsort1 = fopen("names1.txt", "r");
    FILE *fsort2 = fopen("names2.txt", "r");
    FILE *foutput = fopen("names_out.txt", "w");

    if ( !fsort1 || !fsort2 || !foutput)
    {
        perror("Error openng files");
        exit(EXIT_FAILURE);
    }

    char name1[256] = {'\0'};
    char name2[256] = {'\0'};
    char *r1 = fgets(name1, 256, fsort1);
    char *r2 = fgets(name2, 256, fsort2);

    while ( r1 && r2 )
    {
        if ( strcmp(name1, name2) < 0 ) {
            fprintf(foutput, "%s", name1);
            r1 = fgets(name1, 256, fsort1);
        }
        else {
            fprintf(foutput, "%s", name2);
            r2 = fgets(name2, 256, fsort2);
        }
    }
    while ( r1 )
    {
        fprintf(foutput, "%s", name1);
        r1 = fgets(name1, 256, fsort1);        
    }
    while ( r2 )
    {
        fprintf(foutput, "%s", name2);
        r2 = fgets(name2, 256, fsort2);        
    }        
}
© www.soinside.com 2019 - 2024. All rights reserved.