首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用EOF代替feof

用EOF代替feof
EN

Stack Overflow用户
提问于 2018-01-31 19:43:31
回答 2查看 1.6K关注 0票数 2
代码语言:javascript
复制
#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。有人能指出我的代码中有什么问题吗?

EN

回答 2

Stack Overflow用户

发布于 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

代码语言:javascript
复制
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) .}

票数 3
EN

Stack Overflow用户

发布于 2018-02-01 03:04:35

while循环的条件应该是fscanf()语句本身。EOF总是一个整数。见fscanf()

返回值 函数返回它成功转换和赋值的字段数。返回值不包括fscanf()函数读取但未赋值的字段。 如果在任何转换之前发生输入失败,则返回值为EOF,如果成功,则返回指定的输入项数。

而且,和其他人一样,我将向您推荐always wrong?。对于新的C程序员来说,这是关于堆栈溢出的基本内容。

代码语言:javascript
复制
#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时也是有效的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48550232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档