C fscanf 从不返回 EOF

标签 c scanf

int findMaxAndMinValues(FILE *file)
{
    int current_number, max_number = INT_MIN, min_number = INT_MAX;
    rewind(file);
    while ( fscanf(file, "%d", &current_number)!=EOF )
    {
        printf("%d \n", current_number);
        if (current_number > max_number) max_number = current_number;
        if (current_number < min_number) min_number = current_number;       
    }
    printf("Max: %d, Min: %d\n", max_number, min_number);
    return 0;
}

因此,如果文本文件仅充满数字(以及相应的空格/换行符),则效果很好。但是,如果其中有一个字符,它就会开始循环遇到该字符之前读取的最后一个数字。 这是文本文件:

1
2
3 4 5
16 
12312
hello  

结果就是 12312 每行不断更新。
附带问题:是否有更好的方法来查找文本文件中数字的最小/最大值?而不是使用 %d 进行 fscanf ? 编辑:感谢您的回答,这是我修复它的方法:

int findMaxAndMinValues(FILE *file)
{
    int current_number, max_number = INT_MIN, min_number = INT_MAX;
    int temp;
    rewind(file);
    while ( (temp=fscanf(file, "%d", &current_number))!=EOF )
    {
        if (!temp) { fgetc(file); }
        else {
            printf("%d \n", current_number);
            if (current_number > max_number) max_number = current_number;
            if (current_number < min_number) min_number = current_number;
        }
    }
    printf("Max: %d, Min: %d\n", max_number, min_number);
    return 0;
}

最佳答案

阅读手册页。 fscanf() 可以返回除 EOF 之外的其他值。特别是,如果转换失败 - 特别是如果 fscanf() 遇到非数字字符 - 它将返回零以指示未读取任何内容。

您需要根据此信息采取行动。否则下次也将返回零。此后的时间,无穷无尽。

关于C fscanf 从不返回 EOF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42425325/

相关文章:

c - sscanf 语句停止程序

c - scanf()将新行char留在缓冲区中

c - 无法与发出标准输入请求的程序创建交互

c - 如何在c中执行任意管道并继续

c - 字符串的 N 种排列(有重复)

c - 为什么 scanf 忽略最后一个值?

c - 如何使用多线程丢弃 scanf 错误并从 4 个输入整数中识别最高素数

c - scanf 如何知道何时结束 for 循环?

c - 混合 typedef 和定义来强制数据类型大小

c - C中的通用链表排序函数