IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

fonctions fgets et gets


Sujet :

C

  1. #1
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut fonctions fgets et gets
    Bonjour,

    Je dois créer une fonction qui pourra venir s'inclure dans un programme précédemment codé .

    Je voulais savoir si j'utilise bien la fonction fgets et si gets(t) n'aurait pas été préférable ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    /*description du travail*/
    /*morceau de code à inclure au programme pour utiliser*/
    /*la fonction lecture (include,variable...)*/
     
    #include<ctype.h>
     
    /*déclaration de variable*/
    char t[30];
     
    /*prototype de fonction*/
    void lecture(char t[]);
     
    /*fonction lecture*/
    void lecture(char t[])
    {
    	int i;
     
    	fgets(t,30,fichier);
    	for(i=0;t[i]!='\0';i++)
    	{
    		if(isupper(t[i])
    		{
    			t[i]=tolower(t[i]);
    		}
    	}
    }

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    gets() n'est jamais préférable.

    De plus, la valeur 30, tu devrais la passer en paramètre à ta fonction lecture.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    gets() ne devrait plus être utilisée.

    Elle est buggé dans le sens où elle ne permet pas de spécifier la taille du buffer de lecture. D'ailleurs les quelques compilateurs que je connais émettent un warning lorsque on l'utilise.

    Il faut lui préférer la fonction fgets()
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par chicabonux Voir le message
    Je dois créer une fonction qui pourra venir s'inclure dans un programme précédemment codé .

    Je voulais savoir si j'utilise bien la fonction fgets
    J'aurais juste deux remarques:
    • Pourquoi avoir utilisé 30 en dur dans l'appel à fgets() ? Il est préférable de déterminer la taille réelle grâce à sizeof, qui s'adaptera en cas de changement de la taille de t sans risque d'oubli.
    • La fonction fgets() lit également le caractère \n, il peut s'avérer utile de vérifier la présence de ce caractère dans la chaîne lue (pour supprimer ce caractère, pour détecter une lecture partielle, pour purger le buffer, etc.)


    Citation Envoyé par chicabonux Voir le message
    et si gets(t) n'aurait pas été préférable ?
    Certainement pas, gets() ne permet pas de vérifier la taille de la chaîne lue, tu as donc un risque important de débordement de buffer.

  5. #5
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Je devrais faire comme ça avec size_of et pour enlever le caractère \n ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    27
    28
    29
    30
    /*description du travail*/
    /*morceau de code à inclure au programme pour utiliser*/
    /*la fonction lecture (include,variable...)*/
     
    #include<ctype.h>
     
    /*déclaration de variable*/
    char t[30];
     
    /*prototype de fonction*/
    void lecture(char t[30]);
     
    /*fonction lecture*/
    void lecture(char t[30])
    {
    	int i;
     
    	fgets(t,sizeof,fichier);
    	for(i=0;t[i]!='\0';i++)
    	{
    	    if(t[i]!='\n')
    	    {
    		   if(isupper(t[i])
    		    {
    			  t[i]=tolower(t[i]);
    		    }
    	    }
    	    else i++;
        }
    }
    Parce que sinon pour détecter une lecture partielle ou pour purger le buffer , je vois pas comment faire ?

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    La méthode classique, c'est ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    void fpurge(FILE *pIn)
    {
    	int c;
    	while((c=fgetc(pIn))!='\n' && c!=EOF) {}
    }
     
    void fgetspurge(char *buf, size_t taille, FILE *pIn)
    {
    	char *pLF;
    	fgets(buf, taille, pIn);
    	pLF = strchr(buf, '\n');
    	if(pLF != NULL)
    		*pLF = '\0';
    	else
    		fpurge(pIn);
    }
    Ce code lit jusqu'à capacité du buffer, supprime le \n en cas de remplissage partiel, et vide le buffer clavier en cas de remplissage total.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Comment faire pour insérer ces fonctions dans mon code ?

    Et si je mettais jute :

    while(getchar()!='\n');

    ça n'efface pas la mémoire ?

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Cette boucle while est sympa, mais trop simpliste, car elle ne couvre pas le cas d'une erreur de lecture: En cas d'erreur, elle tournerait indéfiniment.
    C'est pour ça qu'on écrit la fonction fpurge à la place.

    Comment faire pour insérer ces fonctions dans mon code ?
    Copier-coller?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par chicabonux Voir le message
    Je devrais faire comme ça avec size_of
    sizeof, pas size_of.

    Citation Envoyé par chicabonux Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fgets(t,sizeof,fichier);
    A quoi correspond fichier ici ? Tu voulais probablement écrire fgets(t, sizeof t, fichier).

    Citation Envoyé par chicabonux Voir le message
    Et si je mettais jute :

    while(getchar()!='\n');

    ça n'efface pas la mémoire ?
    La boucle ne s'arrête pas sur une fin de fichier et va continuer de boucler indéfiniment.


    [EDIT] Correction d'une petite faute inattention.

  10. #10
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    fichier correspond au fichier créé par le programme principal où vients'insérer le bout de code.

    Par contre pour le copier coller ce que je ne comprends pas c'est que je dois l'insérer dans ce bout de code et pas le mettre en dehors ?

    Je dois mettre les 2 fonctions avant ou après le code ? Désolé mais c'est nouveau pour moi de devoir faire ça

  11. #11
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par chicabonux Voir le message
    Par contre pour le copier coller ce que je ne comprends pas c'est que je dois l'insérer dans ce bout de code et pas le mettre en dehors ?

    Je dois mettre les 2 fonctions avant ou après le code ? Désolé mais c'est nouveau pour moi de devoir faire ça
    Ca n'a pas réellement d'importance tant que la fonction est visible de l'appelant.
    Le plus simple est de les mettre avant.

    Il suffit ensuite de remplacer ton appel à fgets() par l'appel à la fonction fgetspurge() fournie par Medinoc.

  12. #12
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Encore une question,

    pour lire une chaîne de caractères sur l'écran, je ne dois pas écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    printf("entrer une ligne de caracteres : \n");
    gets(CH);
    Je dois écrire quoi à la place ? fgets(CH,sizeof,stdin) ?

  13. #13
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fgets(CH, sizeof(CH), stdin);
    Tout simplement
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  14. #14
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    merci

    Et je dois à chaque fois mettre les fonctions fpurge et fgetspurge ou ce n'est que quand je crée un grand programme ?

    (excusez moi d'insister mais je cherche à bien comprendre )

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Disons que fgetspurge() est préférable à fgets() dans la plupart des cas, donc autant l'utiliser systématiquement pour les entrées utilisateur, sauf quand tu as besoin de récupérer TOUTE la ligne tapée indépendamment d'une hypothétique "taille maximale".

    Quand tu te trouves dans ce dernier cas, il faut une solution encore plus compliquée, toujours à base de fgets().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 12/10/2007, 18h05
  2. fonction générique pour get set et change
    Par tretsois dans le forum C++
    Réponses: 9
    Dernier message: 18/02/2007, 18h28
  3. La fonction fgets
    Par thepinguin dans le forum C
    Réponses: 6
    Dernier message: 21/11/2006, 22h14
  4. La fonction fgets est-elle compatible Windows/Unix ?
    Par ashurai dans le forum Langage
    Réponses: 1
    Dernier message: 05/04/2006, 17h59
  5. Réponses: 20
    Dernier message: 25/09/2005, 15h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo