#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。有人能指出我的代码中有什么问题吗?
发布于 2018-01-31 19:57:50
当到达文件结束时,fscanf返回EOF:
曼福斯 #包括 int ( char *format,.);int (文件*流,const *格式,.);int ( const *str,const *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)这样的文件的循环,有关这方面的更多信息,请参见Why is “while ( !feof (file) )” always wrong?。
编辑2
这是我最初的想法,但正如乔纳森·莱弗勒在评论中所指出的:
乔纳森·莱弗勒写道: 您的第一个解决方案要求每行只有一个数字,而问题中的代码没有这样的要求。
他说得对,我没看到。
我来自过去 一个选项是使用
fgets逐行读取输入,然后使用sscanf解析该行: char buffer1024;而(fget(缓冲区,大小缓冲区,fp1)) { if (sscanf(缓冲区,"%d",&num) != 1) { fprintf(stderr,“不能读取整数,忽略行\n”);继续;}if (num %2 == 0) .}
发布于 2018-02-01 03:04:35
while循环的条件应该是fscanf()语句本身。EOF总是一个整数。见fscanf()
返回值 函数返回它成功转换和赋值的字段数。返回值不包括fscanf()函数读取但未赋值的字段。 如果在任何转换之前发生输入失败,则返回值为EOF,如果成功,则返回指定的输入项数。
而且,和其他人一样,我将向您推荐always wrong?。对于新的C程序员来说,这是关于堆栈溢出的基本内容。
#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(),从而将缓冲区提前一个字符。这种方法在从getchar()获得用户输入后,在使用scanf()来提升stdin时也是有效的。
https://stackoverflow.com/questions/48550232
复制相似问题