[英]using EOF instead of feof
#include <stdio.h>
int main() {
FILE *fp1, *fp2, *fp3;
int n, i, num, flag = 0;
/* open files to write even, odd seperately */
fp1 = fopen("data.txt", "r");
fp2 = fopen("even.txt", "w");
fp3 = fopen("odd.txt", "w");
fprintf(fp2, "Even Numbers:\n");
fprintf(fp3, "Odd Numbers:\n");
/* print even, odd and prime numbers in separate files */
while (!feof(fp1)) {
fscanf(fp1, "%d", &num);
if (num % 2 == 0) {
fprintf(fp2, "%d ", num);
} else {
if (num > 1) {
for (i = 2; i < num; i++) {
if (num % i == 0) {
flag = 1;
break;
}
}
}
fprintf(fp3, "%d ", num);
flag = 0;
}
}
fprintf(fp2, "\n");
fprintf(fp3, "\n");
fclose(fp1);
fclose(fp2);
fclose(fp3);
return 0;
}
我想使用EOF代替feof。 我已经尝试过!EOF = fp1,但它不起作用并给出错误。 我只想用EOF代替feof。 谁能指出我的代码出了什么问题?
到达文件结尾时, fscanf
返回EOF
:
曼斯卡夫
#include <stdio.h> int scanf(const char *format, ...); int fscanf(FILE *stream, const char *format, ...); int sscanf(const char *str, const char *format, ...);
[...]
scanf()
函数从标准输入流stdin
读取输入,fscanf()
从流指针stream
读取输入,sscanf()
从str
指向的字符串中读取输入。[...]
返回值
成功后,这些函数将返回成功匹配和分配的输入项的数量; 如果较早匹配失败,则该值可以小于所提供的值,甚至为零。
如果在第一次成功转换或匹配失败发生之前到达输入结束,则返回
EOF
值。 如果发生读取错误,也会返回EOF
,在这种情况下,将设置流的错误指示符(请参阅ferror(3)),并errno
来指示错误。
一种解决方案是将fscanf
的返回值保存在int
变量中,然后再次检查它的0和EOF
,如下所示:
如果您想继续使用fscanf
:
int ret;
while((ret = fscanf(fp1, "%d, &num)) != EOF)
{
if(ret == 0)
{
// fscanf failed to convert the input
// let it consume a charatcer and try again.
getc(fp1);
continue;
}
if(num % 2 == 0)
...
}
编辑
避免使用feof
来控制while(!feof(fp)
这样的文件的循环,有关更多信息,请参见为什么“ while(!feof(file))”总是错误的?
编辑2
这是我最初的想法,但正如乔纳森·莱夫勒(Jonathan Leffler)在评论中指出的那样:
乔纳森·莱夫勒(Jonathan Leffler)写道:
您的第一个解决方案要求每行只有一个数字,问题中的代码不会
他是对的,我没看到。
我从过去
一种选择是使用
fgets
逐行读取输入,然后使用sscanf
解析行:char buffer[1024]; while(fgets(buffer, sizeof buffer, fp1)) { if(sscanf(buffer, "%d", &num) != 1) { fprintf(stderr, "Could not read an integer, ignoring line\\n"); continue; } if (num % 2 == 0) ... }
while循环的条件应该是fscanf()
语句本身。 EOF
始终是整数。 请参见fscanf()
的手册页 :
返回值
fscanf()函数返回成功转换和分配的字段数。 返回值不包括fscanf()函数读取但未分配的字段。
如果在任何转换之前发生输入失败,则返回值为EOF;如果成功,则返回值为分配的输入项数。
而且,像其他所有人一样,我会向您推荐为什么while ( !feof (file) )
总是错误的? 。 对于新C程序员来说,这是有关Stack Overflow的必读内容。
#include <stdio.h>
int main(void) {
FILE *fp1, *fp2, *fp3;
int n, i, num, flag = 0, ret;
/* fopen files */
while ((ret = fscanf(fp1, "%d", &num)) != EOF) {
if (ret == 0) {
getc(fp1);
continue;
}
if (num % 2 == 0) {
fprintf(fp2, "%d ", num);
}
/* rest of the loop here */
}
/* fclose files */
}
如果fscanf()
无法读取一个字符,但不返回EOF,则它通常可以解决getc()
,以使缓冲区前进一个字符。 从scanf()
获取用户输入后,使用getchar()
推进stdin时,此方法也适用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.