As-tu lu ceci et refait tous les exemples ?Citation:
Envoyé par seriousme
http://emmanuel-delahaye.developpez.com/notes.htm#fgetc
Version imprimable
As-tu lu ceci et refait tous les exemples ?Citation:
Envoyé par seriousme
http://emmanuel-delahaye.developpez.com/notes.htm#fgetc
Maintenant oui. :mrgreen:Citation:
As-tu lu ceci et refait tous les exemples ?
Avec le code:
Ce que je crois, mais qui est faux:Code:
1
2
3
4 char c,c1,c2; printf("premier caractere\n"); scanf("%c",&c1); printf("%c %d\n",c1,feof(stdin));
Pièce jointe 2098
Pourrais tu me dire où le raisonnement est faux, s'il te plaît?
Merci d'avance.
Illisible...Tu peux refaire ce texte avec une police à chasse fixe.Citation:
Envoyé par seriousme
Désolé.:oops:
Pièce jointe 2101
Non. Il faut que utilise courrier ou lucida console...Citation:
Envoyé par seriousme
Ca devrait être bon cette fois:
Pièce jointe 2102
Merci de ta patience.
Il suffisait de poster ça :Citation:
Envoyé par seriousme
Si j'ai bien compris,Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 1er "parcours": +-----Etape-----+----Entrée clavier-----+-----Etat du buffer de stdin----+ | 0 | (au début) | vide | | 1 | ^z | ^z | +---------------+-----------------------+--------------------------------+ 1)Dans ce cas "scanf("%c",&c1);" bloque en attendant une frappe clavier valide +--------------+-------------------------+-------------------------------+ | 2 | a | a^z | +--------------+-------------------------+-------------------------------+ 2)la frappe est valide, "scanf("%c",&c1);" prélève le a +---------------------+-------------------------------+------------------+ | 3 | | ^z | +---------------------+-------------------------------+------------------+ "feof" repère le "^z", ça affiche: "a 16" (donc EOF détecté), tout est normal. Autre parcours: +-----Etape-----+----Entrée clavier-----+-----Etat du buffer de stdin-----+ | 0 | (au début) | vide | | 1 | a^z | a^z | +--------------------+----------------------------+-----------------------+ 1)Ici la frappe est valide donc "scanf("%c",&c1);" prélève le a. +---------------+------------------------+-------------------------------+ | 2 | | ^z | +---------------+------------------------+-------------------------------+ 2)Mais l'affichage:a 0 (EOF non détecté) alors que devant se trouver dans le buffer.
est une façon compliquée d'écrireCode:scanf("%c", &c);
Donc, je ne vois pas trop l'intérêt...Code:c = getchar();
Ensuite, concernant feof(), il faut comprendre qu'il ne fait que montrer que la cause de la fin de lecture est 'Fin de fichier'. Il n'est mis à jour que si la fin de fichier s'est produite. L'état qu'il retourne avant n'est pas défini.
C'est la valeur retournée par la fonction de lecture qui sert à dire si celle-ci s'est interrompue ou non.
Il ne consulte pas directement "stdin" mais des flags?Citation:
Il n'est mis à jour que si la fin de fichier s'est produite
Si une autre fonction la rencontre, les flags sont mis à jour et c'est cela que "feof" détecte?Citation:
la fin de fichier s'est produite
Absolument. C'est fait pour identifier la cause de l'arrêt. Mais j'ai expliqué tout ça noir sur blanc dans mes articles, tu ne les a donc pas lus ? C'est désepérant...Citation:
Envoyé par seriousme
Je las ai lus mais ce comportement ne me semblait vraiment pas évident.Citation:
tu ne les a donc pas lus ? C'est désepérant...
Cette phrase est claire maintenant mais avant elle m'était complètement obscure, désolé.Citation:
Le langage C met à disposition les deux fonctions feof() et ferror() qu'il faut appeler après la boucle de lecture, mais avant la fermeture du
fichier.
Merci encore de tes explications et de ta patience.
Mais si il est défini. Mais simplement la manière dont il est défini peut être surprenante pour ceux qui s'attendent à ce que feof soit prédictif.Citation:
Envoyé par Emmanuel Delahaye
feof() indique qu'on a tenté de lire après la fin du fichier. Cela peut être soit par une lecture de plusieurs caractères (fread, fscanf, fgets) auquel cas cette lecture peut ne pas avoir échoué, soit par une lecture d'un caractère auquel cas la lecture aura échoué.
Comme de toute manière une lecture sur un fichier qui retourne feof() échoue, la technique normale en C est de tenter des lectures jusqu'à ce qu'il y en a une qui échoue. Après on teste feof et ferror pour déterminer la cause de l'erreur (si aucun des deux n'est mis, c'est qu'on utilisait fscanf et qu'il y a une erreur de format, ferror indique qu'il y a eu une erreur de lecture donnée par l'OS, feof indique qu'on a atteinds la fin du fichier).
On peut effacer les deux conditions feof et ferror avec clearerr et retenter une lecture. Suivant la cause de l'erreur et l'OS, ça peut passer ou refaire une erreur de suite.
Merci de ces précisions.
En fait pour que "scanf" enclenche le flag de EOF il faut le "forcer", c'est à dire mettre un ^z seul sinon il ne déclenche rien et se contente d'attendre une entrée valide.
C'est pour ça que le premier exemple enclenche le flag EOF et pas le second.
J'hésite à demander la raison de ce comportement.:roll::mouarf: