合并C中的两个文件

时间:2016-12-08 14:45:56

标签: c file fgets eof feof

我想在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 个答案:

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

请看这个问题: Why is “while ( !feof (file) )” always wrong?

答案 3 :(得分:-1)

你不需要cardimages(它很可怕!),只需使用fgets()的返回值,在两个输入文件之间交替。

feof()