繁体   English   中英

使用EOF代替feof

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM