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 :

Redefinition de printf en fprintf


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2005
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 77
    Par défaut Redefinition de printf en fprintf
    Salut
    J'ai vu qu'il existait un post sur la manière de redefinir printf avec un #define.
    Or dans cet exemple, on utilise #ifdef mais je ne vois pas comment faire dans mon cas.
    Je teste l'existence d'un fichier, s'il existe je voudrais que ma fonction :
    ECRIT(("annonce %s",message),HandleLog) écrive dans le fichier HandleLog. Dans le cas contraire (HandleLog = NULL puisque je n'ai pas réussi à ouvrir le fichier) que ECRIT fasse un printf.
    Est-ce possible et si oui comment puis-je faire ?
    Merci.
    Iza

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    J'ai bien peur qu'avec cette syntaxe, tu ne puisses pas vraiment faire ça. Je ne connais aucun moyen de regrouper les deux paramètres de cette macro dans les mêmes parenthèses.

    En C++ il y aurait eu un espoir, mais là...

    Edit: Sauf potentiellement en passant par une variable globale (ou du thread-local storage histoire d'être thread-safe) :
    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
    31
    32
    33
    34
    #define ECRIT(p,h) (SetHandleLog(h), PrintfOuLog p)
     
    /* Note: "inline" n'existe pas en C90,
       mais est disponible en C99, ainsi qu'en extensions GNU et Microsoft */
    #if defined(_MSC_VER)
    #elif defined(__GNUC__)
    	#define INLINE inline
    #define INLINE __inline
    #elif (defined(__STDC_VERSION__) && __STDC_VERSION__ > 199901L)
    #define INLINE inline
    #else
    	#define INLINE
    #endif
     
    /* On définit deux fonctions qui mémorisent le handle 
       dans une variable globale ou du TLS. */
    extern void SetHandleLog(FILE*);
    extern FILE* GetHandleLog();
     
    /* Et maintenant, on définit une fonction inline pour faire le fprintf */
    static INLINE int PrintfOuLog(const char *s, ...)
    {
    	int ret;
    	FILE * handleLog = GetHandleLog(); /*En supposant que HandleLog est de type FILE* */
    	va_list args;
    	va_start(args, s);
     
    	if(handleLog==NULL)
    		handleLog = stdout;
    	ret = vfprintf(handleLog, s, args);
     
    	va_end(args);
    	return ret;
    }
    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
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    Mais tu peux faire beaucoup plus simple avec une syntaxe type:
    ECRIT((HandleLog, "annonce %s",message))

    Là, il te suffit de faire un simple wrapper de vfprintf() qui règle handleLog à stdout en cas de besoin...


    Ou plus simple encore, directement régler HandleLog à stdout si tu n'arrives pas à ouvrir le log...
    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.

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2005
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 77
    Par défaut
    Super, en effet c'est simple, mais je redébute en C, ça fait 10 ans que je n'en ai pas fait...
    Merci !

  5. #5
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut
    Salut,

    Je ne voudrai pas dire de bétise, mais si tu n'arrives pas à ouvrir ton fichier, tu peux affecter à HandleLog la valeur stderr ou stdout.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Si erreur d'ouverture du fichier, redirection du flux sur l'écran
    if(HandleLog==NULL) HandleLog = stderr ;
    ...
    fprintf(HandleLog, "annonce %s", message) ; // "Ecriture" dans le fichier ou sur la sortie stderr
    ....
    Tu ne modifies pas ton code par des macros, tu ne fais que ré-attribuer HandleLog.

    [Edit] Désolé, je n'avait pas vu le message de Médinoc [/Edit]

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

Discussions similaires

  1. printf fprintf puts et fputs
    Par salseropom dans le forum C
    Réponses: 7
    Dernier message: 28/03/2011, 13h49
  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. histoire d'affichage printf fprintf
    Par gnto dans le forum C
    Réponses: 4
    Dernier message: 01/06/2006, 09h20
  5. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24

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