在C语言中,在不破坏顺序的情况下将两个有序文本文件合并为另一个

在C语言中,在不破坏顺序的情况下将两个有序文本文件合并为另一个,c,file,text,merge,C,File,Text,Merge,我有两个文本文件作为 Andrew Hall Arnold Price Shelley Baker 以及 正如你所看到的,它们是有序的。我需要将它们合并到另一个文本文件中,然后再次订购。因此,预期产出为: Andrew Hall Arnold Hill Arnold Price Shelley Baker Veronica Clay 然而,输出显示为: Andrew Hall Arnold Hill Arnold Price 我想不知何故,我丢失了这两个文件的最后一行,并且fsort1和

我有两个文本文件作为

Andrew Hall
Arnold Price
Shelley Baker
以及

正如你所看到的,它们是有序的。我需要将它们合并到另一个文本文件中,然后再次订购。因此,预期产出为:

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);
    }
}
fgets(name100,fsort1);
fgets(名称2、100、fsort2);
而(!feof(fsort1)| |!feof(fsort2)){
if(strcmp(名称1、名称2)
我想不知何故,我丢失了这两个文件的最后一行,并且fsort1和fsort2都到达了它们文件的末尾

是的。注释已经指出了,但是如果循环因为只有一个文件结束而停止,则不能继续读取另一个文件。可以使用以下方法:

#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);        
    }        
}
#包括
#包括
#包括
内部主(空)
{
文件*fsort1=fopen(“names1.txt”、“r”);
文件*fsort2=fopen(“names2.txt”、“r”);
文件*foutput=fopen(“names_out.txt”,“w”);
如果(!fsort1 | | |!fsort2 | |!foutput)
{
perror(“错误打开文件”);
退出(退出失败);
}
字符名称1[256]={'\0'};
字符名称2[256]={'\0'};
char*r1=fgets(name1256,fsort1);
char*r2=fgets(name2256,fsort2);
while(r1和r2)
{
if(strcmp(name1,name2)<0){
fprintf(第四输出,“%s”,名称1);
r1=fgets(名称1、256、fsort1);
}
否则{
fprintf(第四输出,“%s”,名称2);
r2=fgets(名称2,256,fsort2);
}
}
while(r1)
{
fprintf(第四输出,“%s”,名称1);
r1=fgets(名称1、256、fsort1);
}
而(r2)
{
fprintf(第四输出,“%s”,名称2);
r2=fgets(名称2,256,fsort2);
}        
}

可能重复的请参见,
!feof(fsort1)| |!feof(fsort2)
不是一个易于读取的逻辑条件。它将更易于读取
!(feof(fsort1)和&feof(fsort2))
。然而,当到达一个文件的末尾时,代码会继续尝试从两个文件中提取输入,并使用结果,就好像这些结果是正确的一样。@AndrewHenle我理解为什么这样做是错误的,但它们作为替代方法表达的内容并不是我想要的。你有什么建议吗?@DavidBowling我想那一个也是,但它变得比这一个“更错误”。
#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);        
    }        
}