0

我想在 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;
}
4

4 回答 4

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);
    }
}
于 2016-12-08T15:02:12.793 回答
0

尝试使用

!feof (hptr) 

代替

hptr == feof

说明: feof 是一个函数——你正在将一个文件指针hptr与一个永远不会工作的函数指针feof进行比较——但是因为你总是可以在 C 中比较指针,所以编译器不会给你任何错误。

当您在两个 if 语句中使用时,您似乎也有一个剪切和粘贴错误hptr——我确定其中一个应该是dptr

于 2016-12-08T14:50:07.113 回答
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);
  }

请看这个 SO 问题: 为什么“while (!feof (file))”总是错误的?

于 2016-12-08T15:25:08.057 回答
-1

您不需要feof()(这太可怕了!),只需使用 fgets() 的返回值,在两个输入文件之间交替。

#include <stdio.h>

int main(void)
{
char buff[100];
int state;

FILE * one, *two;
one = fopen("one", "r" );
two = fopen("two", "r" );

if (!one || !two) return 1;

for (state=0; ; state ^=1 ) {
        if (!fgets( buff, sizeof buff, state ? two: one)) break;
        printf("%s", buff);
        }

while (fgets( buff, sizeof buff, state? one : two)) {
        printf("%s", buff);
        }
fclose(one);
fclose(two);

return 0;
}
于 2016-12-08T15:26:13.627 回答