fscanf () en C: diferencia entre% sy% c

Estoy usando la función fscanf () para leer un archivo de texto que se ve así:

d 5.234 f a 4.234 b d 53.5 c ... 

y así. Quiero resumir los valores en la columna central, pero solo en las filas donde la primera letra es d y la segunda es f. Mi código se ve así:

 FILE *p; char x[2], z[2]; float y, sum=0; p=fopen("file.txt", "r"); if(p==NULL) return 1; while(!feof(p)) { fscanf(p, "%s %f %s", &x, &y, &z); if (x[0]=='d' && z[0]=='f') sum+=y; } 

y funciona bien, siempre y cuando x y z sean matrices. Si los declaro como caracteres únicos, entonces dígale a fscanf () que analice dichos (% c), por alguna razón, se ejecuta dos veces en la última fila del archivo. Por lo tanto, si la última fila cumple con los requisitos, la sum es mayor de lo que debería ser. ¿Alguien puede decir cuál es la diferencia?

Tu error es feof ().

Se dispara si la última operación causó un EOF. Con% s, esto sucederá que el matcher continuará leyendo hasta que scope EOF. Con% c no lo hará. La siguiente llamada a fscanf () falla, pero no lo verificas.

  while(!feof(fp)) { /* read from fp */ } 

Es un anti-patrón o error común.