提问人:Karim 提问时间:12/8/2016 最后编辑:SiguzaKarim 更新时间:12/8/2016 访问量:929
在 C 中合并两个文件
Merge two files in C
问:
我想在 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赞
Soren
12/8/2016
#1
尝试使用
!feof (hptr)
而不是
hptr == feof
解释:feof 是一个函数 -- 你正在比较一个文件指针和一个函数指针,这永远不会起作用 -- 但是由于你总是可以在 C 语言中比较指针,所以编译器不会给你任何错误。hptr
feof
您似乎也有一个剪切和粘贴错误,因为您在两个 if 语句中使用 - 我敢肯定其中一个应该是hptr
dptr
评论
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 文件结束。这使得很难发表评论。
2赞
Jabberwocky
12/8/2016
请阅读为什么“while ( !feof (file) )”总是错的?
0赞
Joseph Ireland
12/8/2016
@MichaelWalz如果你在和我说话,那么,这个问题没有提到任何事情while (!feof(file1) || !feof(file2))
0赞
Joseph Ireland
12/8/2016
而且,在这种情况下,它确实测试了一些有用的东西。我想最好声明 和 使用的返回值,但这看起来很混乱fgets
while((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;
}
评论
while(!feof())
总是错的(stackoverflow.com/questions/5431941/... )。feof
是一个函数。将文件指针与它进行比较是无稽之谈。hptr
dptr