2017-02-25 36 views
2

我有此功能可以找到带有未知文本的文件中的数字的最大和最小值(“ADS 50 d 15”)。它只适用于文件中的数字,但当有字符时,它会停止。如何从文件中只读取数字,直到C中的EOF为止

{ 
    int n; 
    int min = INT_MAX, max = INT_MIN; 
    int flag = 0; 
    rewind(f); 

    while (fscanf(f, "%d", &n) != EOF) 
    { 

     if (ferror(f)) 
     { 
      perror("Error:"); 
     } 
     if (flag == 0) 
     { 
      min = n; 
      max = n; 
      flag = 1; 
     } 
     if (min>n) 
      min = n; 
     if (max<n) 
      max = n; 
    } 
    printf("\nMax value: %d\nMin value: %d\n", max, min); 
} 
+3

如果输入不匹配的整数,的fscanf返回0,不'EOF'。还要注意,'ferror(f)'只有在'fscanf'已经返回'EOF'时才会成立,因此''if'永远不会运行。 –

回答

2

fscanf在到达文件结束后将返回EOF。它会在成功扫描整数时返回1。如果输入不是整数,它将返回0,并且问题输入必须被移除。

{ 
    int n; 
    int min = INT_MAX, max = INT_MIN; 
    int result = 0; 
    char skip = 0; 

    rewind (f); 
    while ((result = fscanf (f, "%d", &n)) != EOF) 
    { 

     if (result == 0) 
     { 
      fscanf (f, "%c", &skip);//remove a character and try again 
     } 
     else 
     { 
      if (min>n) 
       min = n; 
      if (max<n) 
       max = n; 
     } 
    } 
    printf("\nMax value: %d\nMin value: %d\n", max, min); 
+0

感谢您的帮助!这工作得很好! – user771

3

请尝试以下方法,因为它在此演示程序中显示。您必须使用fscanf而不是此程序中使用的scanf

#include <stdio.h> 
#include <ctype.h> 

int main(void) 
{ 
    int min, max; 
    size_t n = 0; 

    while (1) 
    { 
     char c; 
     int x = 0; 

     int success = scanf("%d%c", &x, &c); 

     if (success == EOF) break; 

     if (success != 2 || !isspace((unsigned char)c)) 
     { 
      scanf("%*[^ \t\n]"); 
      clearerr(stdin); 
     } 
     else if (n++ == 0) 
     { 
      min = max = x; 
     } 
     else if (max < x) 
     { 
      max = x; 
     } 
     else if (x < min) 
     { 
      min = x; 
     } 
    } 

    if (n) 
    { 
     printf("\nThere were enetered %zu values\nmax value: %d\nMin value: %d\n", 
      n, max, min); 
    } 

    return 0; 
} 

如果输入看起来像

1 2 3 4 5a a6 7 b 8 

那么输出将是

There were enetered 6 values 
max value: 8 
Min value: 1 
相关问题