我想在C中合并两个文件,最后停止。
我有一个程序,但即使在我的文件结束后它仍然会拼出单词。例如:
文件1:
a
b
c
文件2:
1
2
3
4
5
我得到的结果是:
a
1
b
2
c
3
c
4
c
5
我想要:
a
1
b
2
c
3
4
5
我认为我的if
循环中的while
语句是我的问题。
我不知道如何定义它。
我的代码是:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char d[200]; //char för da.txt
char h[200]; //char för hej.txt
FILE *hptr, *dptr;
hptr = fopen("hej.txt", "r"); //Öppna hej.txt => hptr
dptr= fopen("da.txt", "r"); //Öppna da.txt => dptr
/*
if(((hptr) == NULL && (dptr) == NULL)) //Fall 1
{
printf("Error, båda filerna är tom");
exit(1);
}
if ((hptr) == NULL) //Fall 2 när hej.txt är tom
{
fscanf(dptr,"%[^/]", d); //Hämtar från da.txt
printf("\nFil 2:\n%s", d); //Skriver ut från da.txt
exit(1);
}
if ((dptr) == NULL) //Fall 3 när da.txt är tom
{
fscanf(hptr,"%[^/]", h); //Hämtar från hej.txt
printf("Fil 1:\n%s", h); //Skriver ut från hej.txt
exit (1);
} */
if(hptr != NULL || dptr != NULL) //Fall 4 när ingen fil är tom
{
while (!feof (hptr) && !feof (dptr))
{
if (hptr ***I guess this is the problem*** == feof)
{
fgets(d, 200, dptr);
printf("%s", d);
}
if (hptr == feof)
{
fgets(h, 200, hptr);
printf("%s", h);
}
}
fclose (hptr);
fclose (dptr);
}
//getch();
return EXIT_SUCCESS;
}
答案 0 :(得分:1)
feof
仅在您尝试执行某些IO时更新。
当你调用fgets,它到达EOF
并失败时,你只需要打印字符串,即使它没有更新。这就是为什么你得到重复的“c”
请改为尝试:
while (!feof (hptr) || !feof (dptr))
{
if (fgets(d, 200, dptr))
{
printf("%s", d);
}
if (fgets(h, 200, hptr))
{
printf("%s", h);
}
}
答案 1 :(得分:0)
尝试使用
!feof (hptr)
而不是
hptr == feof
说明:feof是一个函数 - 你正在将文件指针hptr
与一个永远不会工作的函数指针feof
进行比较 - 但是因为你总是可以比较C中的指针,所以编译器不会给你任何错误。
您在两个if语句中使用hptr
时似乎也出现了剪切和粘贴错误 - 我确定其中一个应该是dptr
答案 2 :(得分:0)
其实你需要这个:
if (hptr != NULL && dptr != NULL) //Fall 4 när ingen fil är tom
{ //^ you need && here, not ||
do
{
if (fgets(d, 200, dptr) != NULL)
printf("%s", d);
if (fgets(h, 200, hptr) != NULL)
printf("%s", h);
} while (!(feof(hptr) && feof(dptr)));
fclose(hptr);
fclose(dptr);
}
答案 3 :(得分:-1)
你不需要cardimages
(它很可怕!),只需使用fgets()的返回值,在两个输入文件之间交替。
feof()