Comprendre l'usage de STDIN ???
Fermé
salmamk27
Messages postés
3
Date d'inscription
jeudi 7 mars 2019
Statut
Membre
Dernière intervention
14 mars 2019
-
7 mars 2019 à 13:06
salmamk27 Messages postés 3 Date d'inscription jeudi 7 mars 2019 Statut Membre Dernière intervention 14 mars 2019 - 9 mars 2019 à 19:18
salmamk27 Messages postés 3 Date d'inscription jeudi 7 mars 2019 Statut Membre Dernière intervention 14 mars 2019 - 9 mars 2019 à 19:18
1 réponse
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
1 094
Modifié le 7 mars 2019 à 18:17
Modifié le 7 mars 2019 à 18:17
Bonjour salmamk27,
cf. http://www.cplusplus.com/reference/cstdio/fgets/
Son 3ème argument est un pointeur sur
Puisque tu dis que étudies les fichiers, tu dois savoir qu'un tel pointeur sur
De fait, tu peux, bien sûr, utiliser
Mais tu peux aussi passer à
La norme du C prévoit que
http://www.cplusplus.com/reference/cstdio/stdin/?kw=stdin
Ce flux de l'entrée standard est, normalement, le flux des caractères entrés au clavier (cela peut être aussi un flux redirigé ayant une autre origine), mis en tampon par le système et qui est accessible par cette fonction
Ici,
Utilisée pour lire des informations provenant d'une saisie par l'utilisateur au clavier, la fonction
C'est une façon recommandée d'éviter les risques de débordement de tampon et de corruption de la mémoire, qui peut occasionner des plantages, comportements imprévisibles ou des problèmes de sécurité, en ignorant les
Cette limitation du nombre de
Par exemple :
Tu dois déduire toi même de la taille disponible l'espace nécessaire au caractère terminateur
Il y a d'autres différences et subtilités, concernant ces fonctions mais je m'arrêterai là pour le moment :-)
Il y a aussi d'autres flux standard définis par le C :
Voir :
http://www.cplusplus.com/reference/cstdio/stdout/
http://www.cplusplus.com/reference/cstdio/stderr/
Dal
fgets()est une fonction définie dans l'entête standard
stdio.het dont le prototype est le suivant :
char * fgets ( char * str, int num, FILE * stream );
cf. http://www.cplusplus.com/reference/cstdio/fgets/
Son 3ème argument est un pointeur sur
FILEpermettant d'accéder à un flux de lecture.
Puisque tu dis que étudies les fichiers, tu dois savoir qu'un tel pointeur sur
FILEsur un flux de lecture peut être défini par l'ouverture d'un fichier avec
fopen()en lecture.
De fait, tu peux, bien sûr, utiliser
fgets()pour lire le contenu disponible dans un fichier.
Mais tu peux aussi passer à
fgets()le pointeur sur
FILE"stdin" qui est définit par
stdio.h.
La norme du C prévoit que
stdinest un pointeur sur FILE permettant d'accéder au flux de l'entrée standard (que tu n'as pas à ouvrir avec
fopen(), car il est déjà disponible selon le standard du C, et que tu ne devrais pas fermer avec
fclose()).
http://www.cplusplus.com/reference/cstdio/stdin/?kw=stdin
Ce flux de l'entrée standard est, normalement, le flux des caractères entrés au clavier (cela peut être aussi un flux redirigé ayant une autre origine), mis en tampon par le système et qui est accessible par cette fonction
fgets()si tu lui passes
stdinen 3ème argument. Le même flux
stdinest accédé par d'autres fonctions définies par
stdio.hconçues pour lire ce flux seulement (comme
scanf()ou
getchar(), qui ne nécessitent pas que tu précises le flux, car elles n'opèrent que sur l'entrée standard).
Ici,
stdinse comporte exactement comme le flux d'un fichier ouvert en lecture.
Utilisée pour lire des informations provenant d'une saisie par l'utilisateur au clavier, la fonction
fgets()a cet avantage qu'il est facile au programme de limiter la lecture du flux à un nombre maximal de
charà lire, pour ne pas dépasser la capacité de l'espace mémoire utilisé pour stocker ce qui est lu : dans ton cas l'emplacement pointé par
str. La lecture du flux est donc limitée à ce qui figure en 2ème argument (
sizeof strla fonction prenant en compte le caractère terminateur
'\0'qui est ajouté).
C'est une façon recommandée d'éviter les risques de débordement de tampon et de corruption de la mémoire, qui peut occasionner des plantages, comportements imprévisibles ou des problèmes de sécurité, en ignorant les
charsaisis en plus qui dépasseraient la capacité de stockage indiquée y compris le caractère terminateur.
Cette limitation du nombre de
charlus sur le flux d'entrée standard est également possible avec
scanf(), en utilisant les spécificateurs de taille de cette fonction, mais cette façon de faire est moins naturelle et peut être omise par les programmeurs inattentifs.
Par exemple :
char str[50] = { '\0' }; printf("Veuillez taper 49 caractères au plus\n"); if (scanf("%49[^\n]", str) == 1) { printf("J'ai récupéré : [%s]\n", str); }
Tu dois déduire toi même de la taille disponible l'espace nécessaire au caractère terminateur
'\0'ajouté par
scanf().
Il y a d'autres différences et subtilités, concernant ces fonctions mais je m'arrêterai là pour le moment :-)
Il y a aussi d'autres flux standard définis par le C :
- le flux de sortie standard (écran du terminal normalement, sauf redirection) :
stdout
(là où va le résultat de printf() par exemple) - le flux (de sortie) d'erreur standard (idem) :
stderr
(là où va le résultat de perror() par exemple)
Voir :
http://www.cplusplus.com/reference/cstdio/stdout/
http://www.cplusplus.com/reference/cstdio/stderr/
Dal
7 mars 2019 à 17:55
Modifié le 7 mars 2019 à 19:24
Dans l'enseignement initial du C il peut même être volontaire par l'enseignant, pour utiliser intentionnellement de façon simplifiée avec (un peu comme un pendant "naturel" à avec ce qui semble être le même ), pour gérer une entrée au clavier sans considérations de robustesse ou de sécurisation du code à ce stade pour ne pas "embrouiller" les personnes débutantes.
La réalité est que est une des fonctions les plus délicates à (bien) utiliser du langage C... il n'y a qu'à voir la taille de la page de manuel de cette fonction.
Elle est quand même pratique lorsqu'elle est bien utilisée...
Comme tu le sais, pour gérer a ses propres problèmes ou contraintes : possible inclusion du retour chariot avant le caractère terminateur (si la taille de la saisie le permet), supposant un retraitement de la chaîne obtenue au clavier, si ce retour chariot est indésirable... d'un autre côté ne prend pas le retour chariot, qui reste dans ...
@salmamk27 : on peut en dire plus sur ces aspects, car tu ne fais qu'entrevoir la partie immergée de l'iceberg. Les deux fonctions nécessitent d'être attentifs au contenu obtenu et à celui restant dans le tampon , non consommé par ou qui peut être différent, si on ne veut pas se retrouver avec des surprises selon les opérations suivantes de lecture de à réaliser.
Il est aussi déconseillé de mélanger l'usage des deux fonctions, compte tenu de leurs comportements différents.
9 mars 2019 à 19:18