2017-12-22 9 views
0

私は2つのテキストファイルを持っています。あなたは彼らが注文されて見ることができるようにCで注文を破ることなく2つの順序付けされたテキストファイルを別のものにマージする

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); 
    } 
} 

ありがとうございます。

+3

可能な複製(https://stackoverflow.com/questions/5431941/why-is- while-feof-file-always-wrong) –

+1

[なぜwhile(!feof(file))が常に間違っているのですか?](https://stackoverflow.com/questions/5431941/why-is-while-feof- file-always-wrong) –

+0

また、 '!feof(fsort1)|| !feof(fsort2) 'は読みやすい論理条件ではありません。 '!(feof(fsort1)&& feof(fsort2))'を読む方が簡単です。しかし、1つのファイルの終わりに達すると、コードは引き続き両方のファイルから入力をフェッチしようとし、その結果が正しいかのように結果を使用します。 –

答えて

1

どういうわけか、私は両方のファイルの最後の行が失われていると思うし、fsort1とfsort2の両方がファイルの終わりに達しています。

はい、あります。コメントでは既にwrong use of feofが指摘されていましたが、のファイルが1つだけで終了したためにループが停止しても、もう一方のファイルを読み取ることはできません。あなたはこのように気にいらを使用することができます:[?なぜ常に間違っている「しばらく(!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);   
    }   
} 
+0

それは動作します、ありがとうございます。ニースのアプローチ。 –

関連する問題