olivthill a écrit :
Par ailleurs, toujours par soucis de cohérence avec la série des fonctions fxxxxx, au lieu de EOF on utilise habituellement feof().
|
Absolument pas. Malgré son nom (et ceci a déjà été dit maintes et maintes fois sur ce fofo), la fonction feof() ne détecte pas la fin de fichier. Son but est de détecter si, une fois que le fichier ne peut plus être lu, si la "non-lecture" est due à une fin de fichier ou autre chose (erreur par exemple). Cela entraine que quand on arrive à la fin de fichier, la fonctio feof() renvoie faux et l'algo effectue une lecture de trop
Exemple
Code :
#include <stdio.h> int main() { FILE *fp; int c; fp=fopen("/etc/passwd", "r" ); while (!feof(fp)) printf("Caractère lu: %c\n", fgetc (fp )); fclose(fp); }
|
L'algo bouclera une fois de trop
xilebo a écrit :
Et ta méthode de lecture dans un fichier n'est pas bonne. Généralement, il vaut mieux lire chaque ligne de ton fichier avec la fonction fgets, qui retourne NULL en cas de fin de fichier ou d'erreur. Voir la doc avec man fgets. Ensuite, tu n'as qu'à faire un sscanf sur ton buffer pour récuperer tes données.
|
C'est au choix du programmeur. C'est vrai que lire une ligne d'un coup va plus vite mais il a le droit de lire caractère par caractère.
Cependant, au lieu de faire comme en COBOL, et écrire
Code :
- lire un caractère
- tant que not EOF
- FAIRE
- traitement
- lire caractère
- FIN FAIRE
|
Le C permet d'écrire
Code :
- tant que caractère lu différent EOF
- FAIRE
- traitement
- FIN FAIRE
|
Ce qui se traduit par
Code :
while ((p=fgetc(flot)) != EOF) { <... traitement ...> }
|
Sinon pour en revenir au problème que je prends en cours de route, ce qui m'inquiète c'est ce fscanf() qui précède la lecture. Déjà étant donné que la lecture elle-même est malhabile, je me demande comment l'ordi réagit avec ce fscanf() placé un peu avant...
---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.