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 :

Utilisation de la fonction fflush()


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : mars 2012
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Utilisation de la fonction fflush()
    Bonjour
    je débute en C et je voudrai comprendre l'utilité de la fonction de fflush() ainsi que la différence entre fflush(stdin) et fflush(stdout), sachant que je travaille sous linux

  2. #2
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    mars 2006
    Messages
    934
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2006
    Messages : 934
    Points : 1 342
    Points
    1 342
    Par défaut
    Salut,

    Citation Envoyé par Threepwood_yume Voir le message
    fflush(stdin)
    Ça vide le tampon d'entrée. Supposons qu'un programme te demande 4 flottants et que tu en rentres 5. Si tu ne vides pas le tampon d'entrée, tu peux être sûr qu'a la prochaine demande le programme utilisera ton cinquième flottant au lieu de ta future réponse.

    Citation Envoyé par Threepwood_yume Voir le message
    fflush(stdout)
    Ça vide le tampon de sortie. Supposons que toutes les secondes tu sauves la température dans un fichier csv. En fait, le tampon n'est réellement écrit dans le fichier que si on a suffisamment d'octets pour écrire un secteur. Si une coupure de courant arrive juste avant qu'on ait assez d'octets pour remplir en secteur, le secteur est perdu. Le flush force l'écriture réelle, même si le secteur n'est pas plein.

    Citation Envoyé par Threepwood_yume Voir le message
    sachant que je travaille sous linux
    Sauf erreur c'est la librairie standard, le comportement est le même quelque soit la plateforme.

    A+

    Pfeuh

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : mars 2012
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Ah d'accord, parce que moi j'ai un problème au niveau de mon application, en fait j'utilise deux threads, l'un client et l'autre serveur, ainsi que la fonction "bcopy" dans les deux threads...le problème c'est que quand le serveur copie sur la mémoire partagée, le client récupère les données de la mémoire partagé mais en retard...ce qui fait que je récupère les données mais pas au bon moment.

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    juin 2009
    Messages
    4 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : juin 2009
    Messages : 4 389
    Points : 13 254
    Points
    13 254
    Billets dans le blog
    1
    Par défaut
    Il y a 2 entrées intéressantes dans la FAQ concernant ce problème :
    1. A quoi sert la fonction fflush ?
    2. Pourquoi ne faut-il pas utiliser fflush(stdin) pour vider le buffer clavier ?


    Comme il ne faut pas utiliser fflush() pour vider le buffer d'entrée, son comportement étant indéterminé, il existe d'autres méthodes pour vider le buffer du clavier, notamment celle décrite dans la FAQ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdio.h>
     
    void clean_stdin(void)
    {
        int c;
     
        do {
            c = getchar();
        } while (c != '\n' && c != EOF);
    }
    D'ailleurs, puisqu'on en parle, cette technique ne provoque t-elle pas une boucle infinie si le buffer est déjà vide ?

  5. #5
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2005
    Messages : 5 761
    Points : 13 724
    Points
    13 724
    Par défaut
    Elle est à utiliser avec précaution : Si le buffer est vide, on va bloquer intempestivement sur le getchar() jusqu'à ce qu'on tape une ligne ou EOF.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    juin 2009
    Messages
    4 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : juin 2009
    Messages : 4 389
    Points : 13 254
    Points
    13 254
    Billets dans le blog
    1
    Par défaut
    J'ai eu le soucis une fois dans un programme. Je l'ai appelé "par acquis" de conscience avant une lecture... Il faut donc l'appeler que si on est sûr que le buffer n'est pas vide, ce qui est un peu contraignant. Y a t-il un moyen de la rendre non bloquante ?

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : mars 2012
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Quelqu'un a une réponse à mon problème ?

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    septembre 2007
    Messages
    7 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2007
    Messages : 7 286
    Points : 23 355
    Points
    23 355
    Par défaut
    Citation Envoyé par pfeuh Voir le message
    Ça vide le tampon d'entrée. Supposons qu'un programme te demande 4 flottants et que tu en rentres 5. Si tu ne vides pas le tampon d'entrée, tu peux être sûr qu'a la prochaine demande le programme utilisera ton cinquième flottant au lieu de ta future réponse… Sauf erreur c'est la librairie standard, le comportement est le même quelque soit la plateforme.
    Pour compléter ce que l'on dit au-dessus, fflush sert à « vider » un buffer en acheminant immédiatement les données qu'il contient vers leur destination finale. Il n'a jamais été question « d'effacer » un buffer. « fflush(stdin) » est indéterminé parce que ça n'a pas de sens : la destination finale des données d'un buffer d'entrée est justement le processus qui a appelé fflush(). S'il ne les lit pas, il n'y a aucun raison que cela bouge.

    Le problème est que, comme le C définit cette action comme étant indéfinie et que de nombreuses personnes font l'amalgame entre fflush(stdin) et fflush(stdout), on trouve certaines bibliothèques qui vident quand même le buffer d'entrée, et c'est un problème car c'est une erreur et cela empêche le programmeur de s'en rendre compte immédiatement.

    On en parlait ici :
    http://www.developpez.net/forums/d11...f/#post6098688
    http://www.developpez.net/forums/d10...r/#post5982737

  9. #9
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    juin 2009
    Messages
    4 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : juin 2009
    Messages : 4 389
    Points : 13 254
    Points
    13 254
    Billets dans le blog
    1
    Par défaut
    Dans le 2e sujet, vous parlez de modifier l'entrée de la FAQ sur "vider le buffer clavier". La solution que tu proposes, Obsidian, ne devrait-elle pas être ajoutée, elle aussi ?

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    septembre 2007
    Messages
    7 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2007
    Messages : 7 286
    Points : 23 355
    Points
    23 355
    Par défaut
    Citation Envoyé par Bktero Voir le message
    La solution que tu proposes, Obsidian, ne devrait-elle pas être ajoutée, elle aussi ?
    En fait, j'aimerais la d'abord la soumettre à l'appréciation des autres visiteurs et des vrais experts du site. En plus, elle utilise des fonctions standard sur pour ainsi dire tous les Unix et Posix, mais elle n'est pas strictement C standard. Il faudrait la valider sur d'autres plateformes…

Discussions similaires

  1. [LG]Utilisation de la fonction time
    Par kmitz dans le forum Langage
    Réponses: 4
    Dernier message: 08/04/2005, 14h05
  2. Utilisation de la fonction de déploiement
    Par mchicoix dans le forum XMLRAD
    Réponses: 4
    Dernier message: 01/03/2005, 15h35
  3. [LG]Utilisation de la fonction Random
    Par chloe95 dans le forum Langage
    Réponses: 1
    Dernier message: 01/03/2005, 15h20
  4. Utilisation de la fonction qsort
    Par Jsmeline dans le forum C
    Réponses: 8
    Dernier message: 28/01/2005, 13h40
  5. [LG]librairies : utiliser seulement quelques fonctions
    Par wwwroom dans le forum Langage
    Réponses: 13
    Dernier message: 14/05/2004, 23h50

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