嗨,我尝试了相同的使用fgets,但结果非常不同,我能够通过fget实现它,但不使用fgets,我做错了什么。不知何故,在合并一行时会跳过,例如,它从每个文件复制第一个文件,然后跳到第三行。
#include<stdio.h>
#include<stdlib.h>
#include<strings.h>
int main()
{
FILE *pointer1, *pointer2, *pointer3;
char source1[80],source2[80],target[80];
char str1[80],str2[80];
printf("Enter the source and source 2n");
scanf("%s %s", source1,source2);
printf("Enter the destinationn");
scanf("%s",target);
pointer1 = fopen(source1,"r");
pointer2 = fopen(source2,"r");
pointer3 = fopen(target,"w");
if(pointer1 == NULL || pointer2==NULL || pointer3==NULL) {
printf("Cannot open a filen ");
exit(1);
}
while(1) {
if(fgets(str1,79,pointer1)!=NULL) {
fputs(str1,pointer3);
}
if(fgets(str1,79,pointer1)==NULL)
break;
if(fgets(str2,79,pointer2)!=NULL) {
fputs(str2,pointer3);
}
if(fgets(str2,79,pointer2)==NULL)
break;
}
fclose(pointer1);
fclose(pointer2);
fclose(pointer3);
printf("Merging completed successfullyn");
printf("Press any key to exitn");
getch();
}
您得到的意外行为实际上是非常预期的。即使在您的脑海中,您只是在测试文件是否尚未完成,例如:if(fgets(..) != NULL)
,该函数实际上从文件中提取该行并丢失它,因为您没有对它做任何操作。
首先,我要提到两件事:
- 至少在我的电脑上,你需要包含"conio.h"所以我不知道它在你的电脑上是如何编译的。
- 为将来参考,请查看编码风格指南,因为有很多错误。试试这个链接:https://users.ece.cmu.edu/~eno/coding/CCodingStandard.html。想要更简单的方法,只需在谷歌上搜索:"C代码美化"。他们会照顾你的编码风格和代码。
我会帮你解决这个问题,但是,为了不让它太容易,我也犯了一个小错误。
#include<stdio.h>
#include<stdlib.h>
#include<strings.h>
#include<conio.h>
int main() {
FILE *pointer1, *pointer2, *pointer3;
char source1[80], source2[80], target[80];
char str1[80], str2[80];
printf("Enter the source and source 2n");
scanf("%s %s", source1, source2);
printf("Enter the destinationn");
scanf("%s", target);
pointer1 = fopen(source1, "r");
pointer2 = fopen(source2, "r");
pointer3 = fopen(target, "w");
if (pointer1 == NULL || pointer2 == NULL || pointer3 == NULL) {
printf("Cannot open a filen ");
exit(1);
}
int end_first_file = 0;
int end_second_file = 0;
while (1) {
if (fgets(str1, 79, pointer1) != NULL && end_first_file == 0) {
fputs(str1, pointer3);
} else {
end_first_file = 1;
}
if (fgets(str2, 79, pointer2) != NULL && end_second_file == 0) {
fputs(str2, pointer3);
} else {
end_second_file = 1;
}
if(end_second_file && end_first_file)
break;
}
fclose(pointer1);
fclose(pointer2);
fclose(pointer3);
printf("Merging completed successfullyn");
printf("Press any key to exitn");
getch();
}
我告诉你的,我要你解决的错误是:
以:
Source1:
aa aaa
Source2:
bb
bbb
bbbb
您将得到输出:
aa
bb
aaabbb
bbbb
问题1:发生了什么?"aaabbb"你怎么解决这个问题?亲切的问候,Claudiu