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 :

printf fprintf puts et fputs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut printf fprintf puts et fputs
    Bonjour, en lisant man puts, man printf et man fprintf, quelle est la différence entre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    printf("toto\n");
    puts("toto"); /* si j'ai bien compris (man puts), il y a un \n rajouté à la fin */
    et entre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    fprintf(stdout,"toto\n");
    fputs("toto");
    de plus, toujours d'après man perror et man fprintf, quelle est la différence entre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    fprintf(stderr,"toto\n");
    perror("toto");
    j'espère que mes questions ne sont pas trop "bêtes"...
    Merci

  2. #2
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Salux,

    Tu as bien compris les nuances entre les fonctions, sauf pour fputs qui prend en plus le stream dans lequel ecrire et qui ne met pas de \n (ya que puts() qui le fait)
    puts et fputs seraient à priori un poil pubien plus rapide que (f)printf puisque sans analyse de chaine de format. Il faut qd meme noter que l'analyse debute seulement dès que ya un % et que sans ça, c'est surement similaire à (f)puts

    La difference entre fprintf(stderr,"toto\n"); et perror("toto"); c'est que perror va afficher en plus un message d'erreur standard (dans la langue de la locale selectionnée) correspondant à l'erreur positionnée par la derniere fonction standard (errno)

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Gruik
    La difference entre fprintf(stderr,"toto\n"); et perror("toto"); c'est que perror va afficher en plus un message d'erreur standard (dans la langue de la locale selectionnée) correspondant à l'erreur positionnée par la derniere fonction standard (errno)
    Ce qui veut dire que perror n'affiche QUE les erreurs des fonctions standards (c'est à dire uniquement quand errno est mis).

    Et donc, si j'en juge par les posts des étudiants ou élèves, je crois qu'il faudrait absolument mettre ce point en avant, car j'ai l'impression qu'on leur dit d'utiliser perror ppour debugger...

    Ce qui fait que, pour moi, à part quelques cas particuliers, je préfère me servir de "fprintf (stderr,...)" pour être homogène et ne pas avoir 2 mécanismes différents pour afficher les erreurs.

  4. #4
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par Gruik
    Salux,

    Tu as bien compris les nuances entre les fonctions, sauf pour fputs qui prend en plus le stream dans lequel ecrire et qui ne met pas de \n (ya que puts() qui le fait)
    puts et fputs seraient à priori un poil pubien plus rapide que (f)printf puisque sans analyse de chaine de format. Il faut qd meme noter que l'analyse debute seulement dès que ya un % et que sans ça, c'est surement similaire à (f)puts
    D'ailleurs, le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
    #include <stdlib.h>
     
    void fonction(void)
    {
        printf("Hello world!\n");
    }
     
    int main(void)
    {
        fonction();
     
        return EXIT_SUCCESS;
    }
    compilé avec gcc avec l'option d'optimisation -O2 donne le code assembleur suivant pour fonction():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    .globl fonction
            .type   fonction, @function
    fonction:
            pushl   %ebp
            movl    %esp, %ebp
            subl    $8, %esp
            movl    $.LC0, (%esp)
            call    puts
            leave
            ret
    On remarque une optimisation agressive où printf() a été remplacé par puts(), la chaîne de format ne contenant aucun %.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  5. #5
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Hm, ça me troue!
    En plus, il a du enlever le \n de la chaine d'origine pour que ça marche
    Je me demande ce qu'il se passe avec une chaine originellemenet sans \n

  6. #6
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Gruik
    Hm, ça me troue!
    En plus, il a du enlever le \n de la chaine d'origine pour que ça marche
    Pourquoi ? C'est étonnant ? C'est un simple test dans une passe du compilateur et une modification de la fonction appelée...

    Je me demande ce qu'il se passe avec une chaine originellemenet sans \n
    Alors il utilisera printf...

    Jc

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Merci de vos précisions.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 14/03/2015, 13h33
  2. printf et fprintf.
    Par doudounico dans le forum C
    Réponses: 14
    Dernier message: 06/01/2010, 21h16
  3. Différence printf() et fprintf()
    Par cmoibal dans le forum C
    Réponses: 8
    Dernier message: 21/05/2008, 18h11
  4. Redefinition de printf en fprintf
    Par iza76 dans le forum C
    Réponses: 4
    Dernier message: 13/03/2008, 17h35
  5. histoire d'affichage printf fprintf
    Par gnto dans le forum C
    Réponses: 4
    Dernier message: 01/06/2006, 09h20

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