我有两个文本文件:
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);
}
}
谢谢。
答案 0 :(得分: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);
}
}