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 :

redirection de stdout


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 33
    Par défaut redirection de stdout
    Bonjour,
    je voudrais créer une variable globale en C.
    si je lui donne comme valeur stdout, j'aimerai que mes printf se fassent sur la console, mais si je lui donne un autre nom (typiquement un nom de fichier), je voudrais que mes printf soient redirigés vers ce fichier et donc ne s'affichent plus à l'écran.
    Avez vous une solution?
    Bien cordialement
    tet.dum

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    je voudrais créer une variable globale en C.
    NON, évite à tout prix les variables globales.

    Avez vous une solution?
    Utilise fprintf(). http://man.developpez.com/man3/fprintf.3.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    FILE * fichier; /* A initialiser avec fopen stdout stderr */
    fprintf (stdout,...
    fprintf (fichier,...

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

    Informations professionnelles :
    Activité : Développeur Web

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

    regarde du côté de freopen

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par tet.dum Voir le message
    je voudrais créer une variable globale en C.
    T'es sûr ? On a kidnappé ta fille pour t'obliger à ça ?

    http://emmanuel-delahaye.developpez....s.htm#globales
    si je lui donne comme valeur stdout, j'aimerai que mes printf se fassent sur la console, mais si je lui donne un autre nom (typiquement un nom de fichier), je voudrais que mes printf soient redirigés vers ce fichier et donc ne s'affichent plus à l'écran.
    Bah, justement, il n'y a pas besoin de variable globale (visible). Il suffit d'utiliser freopen() pour envoyer stdout où tu veux...

    "They have kidnapped my daughter !"
    -- J.B. in 24.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 98
    Par défaut
    Juste pour savoir, bien sur les variables globales sont globalement a proscrire mais n'y a t'il pas certains cas ou cela est qd mm preferable et pratique (si deja on la repere bien) ?

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par pmier Voir le message
    Juste pour savoir, bien sur les variables globales sont globalement a proscrire mais n'y a t'il pas certains cas ou cela est qd mm preferable et pratique (si deja on la repere bien) ?
    Il y a des cas où elles sont indispensables. Ces cas sont très rares et doivent être parfaitement justifiés et documentés.

    Si elle ne sont pas indispensable, c'est simple, on s'en passe. Point.

    Nota : Bien sûr, on parles de variables globales ou statiques modifiables. Si ce sont des const (lecture seule) aucun problème.

  7. #7
    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
    et je rajouterais qu'il faut faire la distinction entre variables globales à 1 MODULE (un fichier), qui sont à limiter le plus possible, mais dont parfois on ne peut se passer, et variables globales à PLUSIEURS MODULES (fichiers), qui comme l'a dit Emmanuel sont A PROSCRIRE !!!! (bien sûr comme il l'a dit à part les constantes).

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    et je rajouterais qu'il faut faire la distinction entre variables globales à 1 MODULE (un fichier), qui sont à limiter le plus possible, mais dont parfois on ne peut se passer, et variables globales à PLUSIEURS MODULES (fichiers), qui comme l'a dit Emmanuel sont A PROSCRIRE !!!! (bien sûr comme il l'a dit à part les constantes).
    Oui, tu mets en avant les problèmes liés à la portabilité et tu as raison, mais le terme 'globales' recouvre aussi le problème des variables persistantes à instanciation uniques (singleton dans d'autres langages, enfin, je crois...), que sont les variables statiques en général (quelles que soient leurs portées). Ce genre de variable plombe le code en empêchant toute instanciation, car la règle sacro-sainte de la séparation du code et des données a été brisée...

    (et évidemment toute utilisation 'imbriquée' ou multi-tâche devient impossible : strtok() etc.)

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 98
    Par défaut
    Oui oui j'imagine bien que dans le cas de variables globale à plusieurs modules ca gène en plus pour la portabilité.

    Sinon vous parlez de cas ou on ne peux pas faire autrement, auriez vous des exemples de tels cas (enfin disons quels sont les raisons qui font qu'on ne peut pas faire autrement ?)

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par pmier Voir le message
    Oui oui j'imagine bien que dans le cas de variables globale à plusieurs modules ca gène en plus pour la portabilité.
    Non, rien à voir.
    Sinon vous parlez de cas ou on ne peux pas faire autrement, auriez vous des exemples de tels cas (enfin disons quels sont les raisons qui font qu'on ne peut pas faire autrement ?)
    Il y en un dans ma bibliothèque :

    http://emmanuel-delahaye.developpez.com/clib.htm
    Module SYSALLOC
    sysalloc.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    /* private data ======================================================== */
     
    #if DBG
    static sTRACE G_Trace;
    #endif
    parce que l'interface m'est imposé. (malloc()/free()).

    Les autres cas sont les handlers d'interruptions matérielles, car ils n'ont pas de paramètres par définition.

    Ou alors certains mécanismes de debug (flags, compteurs) ajoutés sans modifier l'interface des fonctions (mais là, on commence la gorétisation, car ils pourraient être dans les contextes...)

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 33
    Par défaut
    merci à tous pour vos réponses...
    voila ce que j'ai fait finalement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    FILE * fichier_sortie;
    fichier_sortie = stdout;
    /* ou au choix : on redirige sur une fichier de sortie */
    /*fichier_sortie=fopen("mon_fichier.txt","a");*/
     
    (void) fprintf(fichier_sortie, "%s", S);
     
    if (fichier_sortie!=stdout) { /*on a ecrire dans un fichier, il faut le fermer*/
        fclose(fichier_sortie);
    je suis contente que cette discussion en ait engendré d'autres... la, on se rend compte que le forum est vraiment utile..
    je tag quand meme la discussion en résolu.
    Merci et bonne journée à tous !
    tet.dum

  12. #12
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par tet.dum Voir le message
    la, on se rend compte que le forum est vraiment utile..
    Vu que tu as superbement ignore la solution propre utilisant freopen(), on se demande quand meme si ce forum est utile...

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 98
    Par défaut
    Emmanuel que voulais-tu dire quand tu disais en reponse a souviron 34

    Citation Envoyé par souviron34 Voir le message
    et je rajouterais qu'il faut faire la distinction entre variables globales à 1 MODULE (un fichier), qui sont à limiter le plus possible, mais dont parfois on ne peut se passer, et variables globales à PLUSIEURS MODULES (fichiers), qui comme l'a dit Emmanuel sont A PROSCRIRE !!!! (bien sûr comme il l'a dit à part les constantes).
    Oui, tu mets en avant les problèmes liés à la portabilité et tu as raison, mais le terme 'globales' recouvre aussi le problème des variables persistantes à instanciation uniques (singleton dans d'autres langages, enfin, je crois...), que sont les variables statiques en général (quelles que soient leurs portées).
    J'avais compris que tu voulais dire que ca gêne pour la réutilisation des fonctions du fait du risque d'une variable de mm nom dans le nouveau code (meme si je suis pas sur que ca s'appel portabilité)

    Pour les autres exemples merci je suis convaincu

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

Discussions similaires

  1. Redirection de stdout en C vers Python
    Par makia42 dans le forum PyQt
    Réponses: 11
    Dernier message: 05/04/2011, 21h03
  2. Réponses: 4
    Dernier message: 16/04/2008, 19h54
  3. Redirection stdin / stdout
    Par Neitsa dans le forum Linux
    Réponses: 3
    Dernier message: 17/02/2007, 15h57
  4. Redirection de stdout en C
    Par gege2061 dans le forum Linux
    Réponses: 4
    Dernier message: 06/03/2006, 15h49

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