C fscanf永远不会返回EOF

问题描述:

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; 
} 

所以这工作正常,如果文本文件只充满数字(和空格/新行相应)。但是如果我有一个角色,它会在遇到角色之前开始循环读取它读取的最后一个数字。 这是文本文件:C fscanf永远不会返回EOF

1 
2 
3 4 5 
16 
12312 
hello 

而结果就是12312每行不休更新。
旁边的问题:有没有更好的方法来找到文本文件中的最小/最大值的数字? %s的fscanf而不是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; 
} 
+0

你忘了问一个问题。你没有代码来读取你的文件中的“hello”,所以没有任何东西会读取它,所以你永远不会到文件的末尾。 –

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

您需要对此信息采取行动。否则,下一次也会返回零。之后的那段时间,无限的。

+0

“在早期匹配失败的情况下甚至为零”哦,我确实想念它..谢谢你的答案。 – KayleMaster

如果程序输入包含非数字,则代码无限循环的原因是fscanf()不会消耗输入,但它无法匹配,但在匹配失败的情况下,它也不会返回EOFEOF仅在输入结束时之前执行成功转换或发生匹配故障或发生读取错误时才返回。 (读取错误是I/O错误 - 与匹配失败完全不同)。当您的特定程序遇到匹配失败时,它只是循环回去并尝试读取完全相同的输入(等待被读取)再次。解决问题

一种方法是fscanf()的返回值与预期(1)项的数目进行比较,如果你看到任何东西从回路断线,是否EOF0,或什么:

while (fscanf(file, "%d", &current_number) == 1) // ... 

当程序遇到一个非数字时会停止读取数字;如果你想让跳过非数字,那么这也可以完成,但它会更复杂一点。

+0

是的,情况正是如此。我添加了一张支票并进行了修正(代码如上)!哇*真棒 – KayleMaster