合并文件的C程序找不到EOF,陷入无限循环!
我在尝试运行我正在开发的这个程序时遇到一些问题...要求说我不允许使用排序功能...我自己做了一些事情...等等。
几乎,该程序编译但在执行后挂起...我猜它陷入了无限循环...但我似乎找不到它...:(
该程序读取已经存在的数据文件从最小到最大排序并将它们合并(排序)到第三个 .txt 文件中...
这两个文件是 Data1.txt 和 Data2.txt 包含:
Data1.txt
2
2
2
2
Data2.txt
1
3
5
7
9
merge.c
#include <stdio.h>
#include <stdlib.h>
void sortData(FILE *fpData1, FILE *fpData2)
{
int n, m;
FILE *fpMerge;
fpMerge = fopen("Merge.txt", "w+");
fscanf(fpData2, "%i", &n);
fscanf(fpData1, "%i", &m);
while(n != EOF || m != EOF)
{
if(n == EOF)
{
fscanf(fpData1, "%i", &m);
while(m != EOF)
{
fprintf(fpMerge, "%i\n", m);
fscanf(fpData1, "%i", &m);
}
}
if(m == EOF)
{
fscanf(fpData2, "%i", &n);
while(n != EOF)
{
fprintf(fpMerge, "%i\n", n);
fscanf(fpData2, "%i", &n);
}
}
if(n < m)
{
fprintf(fpMerge, "%i\n", n);
fscanf(fpData2, "%i", &n);
}
if(n > m)
{
fprintf(fpMerge, "%i\n", m);
fscanf(fpData1, "%i", &m);
}
if(n == m)
{
fprintf(fpMerge, "%i\n", n);
fprintf(fpMerge, "%i\n", m);
fscanf(fpData2, "%i", &n);
fscanf(fpData1, "%i", &m);
}
}
fclose(fpMerge);
}
int main (void)
{
FILE *fpData1;
FILE *fpData2;
fpData1 = fopen("Data1.txt", "r");
if(fpData1 == NULL)
{
printf("There was an error opening the file...program terminating..\n");
exit(1);
}
fpData2 = fopen("Data2.txt", "r");
if(fpData2 == NULL)
{
printf("There was an error opening the file...program terminating..\n");
exit(1);
}
sortData(fpData1, fpData2);
fclose(fpData1);
fclose(fpData2);
return 0;
}
I'm having some problems trying to run this program I am working on...The requirements say I was not allowed to use a sort function...I had do something myself....etc.
Pretty much, the program compiles but hangs after executed...I'm guessing it's stuck in an infinite loop...but I can't seem to find it... :(
This program reads to data files that will already be ordered least to greatest and merges them (ordered) into a third .txt file...
The two files are Data1.txt and Data2.txt
contains:
Data1.txt
2
2
2
2
Data2.txt
1
3
5
7
9
combine.c
#include <stdio.h>
#include <stdlib.h>
void sortData(FILE *fpData1, FILE *fpData2)
{
int n, m;
FILE *fpMerge;
fpMerge = fopen("Merge.txt", "w+");
fscanf(fpData2, "%i", &n);
fscanf(fpData1, "%i", &m);
while(n != EOF || m != EOF)
{
if(n == EOF)
{
fscanf(fpData1, "%i", &m);
while(m != EOF)
{
fprintf(fpMerge, "%i\n", m);
fscanf(fpData1, "%i", &m);
}
}
if(m == EOF)
{
fscanf(fpData2, "%i", &n);
while(n != EOF)
{
fprintf(fpMerge, "%i\n", n);
fscanf(fpData2, "%i", &n);
}
}
if(n < m)
{
fprintf(fpMerge, "%i\n", n);
fscanf(fpData2, "%i", &n);
}
if(n > m)
{
fprintf(fpMerge, "%i\n", m);
fscanf(fpData1, "%i", &m);
}
if(n == m)
{
fprintf(fpMerge, "%i\n", n);
fprintf(fpMerge, "%i\n", m);
fscanf(fpData2, "%i", &n);
fscanf(fpData1, "%i", &m);
}
}
fclose(fpMerge);
}
int main (void)
{
FILE *fpData1;
FILE *fpData2;
fpData1 = fopen("Data1.txt", "r");
if(fpData1 == NULL)
{
printf("There was an error opening the file...program terminating..\n");
exit(1);
}
fpData2 = fopen("Data2.txt", "r");
if(fpData2 == NULL)
{
printf("There was an error opening the file...program terminating..\n");
exit(1);
}
sortData(fpData1, fpData2);
fclose(fpData1);
fclose(fpData2);
return 0;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您不想比较
n != EOF
,而是比较fscanf
的返回值:fscanf
也会返回EOF< /code> 出错。如果您需要区分 EOF 和错误条件,请使用
ferror(fpData1)
,然后查找错误代码(存储在errno
中)。You don't want to compare
n != EOF
, but rather the return value offscanf
:fscanf
will also returnEOF
on error. If you need to tell EOF and error conditions apart, useferror(fpData1)
, say, and then look up the error code (stored inerrno
).您对 EOF 的测试不太正确
Your testing of EOF is not quite correct
EOF 不是一个字符。
EOF 不是整数。
任何文件中都不会包含 EOF(既不是
char
也不是int
)。EOF 是一个条件。
文件要么处于该状态,要么(通常)不处于该状态。
您应该检查
fscanf()
的返回值以检测EOF或其他问题。EOF is not a character.
EOF is not an integer.
No files will ever have EOF (neither
char
norint
) in them.EOF is a condition.
Files will either be on that condition or (usually) not.
You should check the return value of
fscanf()
to detect EOF or other problems.