在 C 中合并两个文件

Merge two files in C

提问人:Karim 提问时间:12/8/2016 最后编辑:SiguzaKarim 更新时间:12/8/2016 访问量:929

问:

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

我认为这是我在循环中的陈述是我的问题。 我不知道如何定义它。ifwhile

我的代码是:

#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;
}
C 文件 fgets eof feof

评论

5赞 pmg 12/8/2016
while(!feof())总是错的(stackoverflow.com/questions/5431941/... )。
1赞 Eugene Sh. 12/8/2016
feof是一个函数。将文件指针与它进行比较是无稽之谈。
0赞 Jabberwocky 12/8/2016
在启用警告的情况下进行编译。
0赞 M Oehm 12/8/2016
不是你的核心问题,但你希望成为空:如果(hptr & dptr)......”hptrdptr

答:

0赞 Soren 12/8/2016 #1

尝试使用

!feof (hptr) 

而不是

hptr == feof

解释:feof 是一个函数 -- 你正在比较一个文件指针和一个函数指针,这永远不会起作用 -- 但是由于你总是可以在 C 语言中比较指针,所以编译器不会给你任何错误。hptrfeof

您似乎也有一个剪切和粘贴错误,因为您在两个 if 语句中使用 - 我敢肯定其中一个应该是hptrdptr

评论

0赞 Soren 12/8/2016
答案基本上是 -- 其中哪一部分是错误的?comparing a datapointer against a function pointer will not work
0赞 Soren 12/8/2016
(然后他删除了他的评论)
1赞 Andrew Henle 12/9/2016
@Soren这就是你引用它们的原因。:-)
1赞 Joseph Ireland 12/8/2016 #2

feof仅在您尝试执行某些 IO 时更新。 当你调用 fgets 时,它到达并失败,你仍然只是打印字符串,即使它没有更新。这就是为什么你得到重复的“c”EOF

请尝试以下操作:

 while (!feof (hptr) || !feof (dptr))
 {
    if (fgets(d, 200, dptr))
    {
        printf("%s", d);
    }

    if (fgets(h, 200, hptr))  
    {
        printf("%s", h);
    }
}

评论

1赞 Karim 12/8/2016
感谢您的帮助!我们把&&改成了||而且它工作正常。
0赞 Joseph Ireland 12/8/2016
答案是肯定的。。。顺便说一句,上面的代码似乎实际上并没有给出您所说的输出,即不应输入 if 语句,而 while 在 sortest 文件结束。这使得很难发表评论。
0赞 Joseph Ireland 12/8/2016
@MichaelWalz如果你在和我说话,那么,这个问题没有提到任何事情while (!feof(file1) || !feof(file2))
0赞 Joseph Ireland 12/8/2016
而且,在这种情况下,它确实测试了一些有用的东西。我想最好声明 和 使用的返回值,但这看起来很混乱fgetswhile((d_line=fgets(d,200,dptr) ||(h_line=fgets(h,200,hptr))
0赞 Jabberwocky 12/8/2016 #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 问题:为什么“while ( !feof (file) )”总是错的?

-1赞 joop 12/8/2016 #4

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

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