2017-02-25 8 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

There were enetered 6 values max value: 8 Min value: 1 
であろう。また、 'fscanf'がすでに' EOF'を返すときにのみ、 'ferror(f)'が真であることに注意してください。 '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

このデモプログラムで示されているように、以下の方法を試してみてください。このプログラムではscanfの代わりにfscanfを使用する必要があります。

#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 

ように見える場合、入力が0を返す関数fscanf整数ではなく、 `EOF`と一致しない場合、出力は