【问题标题】:Merge two files in C在C中合并两个文件
【发布时间】:2016-12-08 14:45:56
【问题描述】:

我想在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

我认为我的while 循环中的if 语句是我的问题。 不知道怎么定义。

我的代码是:

#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;
}

【问题讨论】:

  • while(!feof()) 总是错误的(stackoverflow.com/questions/5431941/…)。
  • feof 是一个函数。将文件指针与它进行比较是无稽之谈。
  • 编译时启用警告。
  • 不是你的核心问题,但你想成为hptr dptr非空:if (hptr && dptr) ...`跨度>

标签: c file fgets eof feof


【解决方案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);
    }
}

【讨论】:

  • 感谢您的帮助!我们将 && 更改为 ||它工作正常。
  • 当然...顺便说一句,上面的代码似乎实际上并没有给出您所说的输出,即不应输入 if 语句,而 while 以最排序的文件结束。这让人很难评论。
  • @MichaelWalz 如果你在跟我说话,那么,这个问题并没有提到任何关于while (!feof(file1) || !feof(file2))
  • 而且,在这种情况下,它确实测试了一些有用的东西。我想最好声明fgets的返回值并使用while((d_line=fgets(d,200,dptr) ||(h_line=fgets(h,200,hptr)),但这看起来很乱
【解决方案2】:

尝试使用

!feof (hptr) 

而不是

hptr == feof

解释:feof 是一个函数——你正在将文件指针hptr 与函数指针feof 进行比较,这永远不会起作用——但是由于你总是可以在 C 中比较指针,因此编译器不会给你任何错误.

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

【讨论】:

  • 答案本质上是comparing a datapointer against a function pointer will not work——其中哪一部分是错误的?
  • (然后他删除了他的 cmets)
  • @Soren 这就是你引用他们的原因。 :-)
【解决方案3】:

其实你需要这个:

  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 问题: Why is “while ( !feof (file) )” always wrong?

【讨论】:

    【解决方案4】:

    你不需要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;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-04-29
      • 1970-01-01
      • 2014-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-08
      相关资源
      最近更新 更多