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

Bibliothèque standard C Discussion :

freopen sur stdout


Sujet :

Bibliothèque standard C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 138
    Par défaut freopen sur stdout
    Bonjour,

    Je souhaite rediriger la sortie standard vers un fichier. J'y arrive avec la fonction freopen.

    Exemple :
    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
     
    #include <stdio.h>
     
    main() {
     
        /* redirection de stdout dans un fichier */
        if ( freopen("c:\\tempo.log", "w", stdout) == NULL)
           fprintf(stderr, "erreur a la redirection de stdout\n");
     
        /* Cet affichage va dans le fichier  tempo.log */
        printf("Cet affichage va dans le fichier\n");
     
        /* fermeture du flux stdout */
        fclose(stdout);
     
        return 0;
    }
    Par contre, je ne trouve pas de moyen de pour revenir a l'état d'avant la redirection. Si je fait :

    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
     
    #include <stdio.h>
     
    main() {
     
        /* redirection de stdout dans un fichier */
        if ( freopen("c:\\tempo.log", "w", stdout) == NULL)
           fprintf(stderr, "erreur a la redirection de stdout\n");
     
        /* Cet affichage va dans le fichier  tempo.log */
        printf("Cet affichage va dans le fichier\n");
     
        /* fermeture du flux stdout */
        fclose(stdout);
     
    	printf("Cet affichage va dans la sortie standard\n");
     
        return 0;
    }
    la chaine de caractère "Cet affichage va dans la sortie standard" ne va ni dans le fichier c:\\tempo.log, ni sur la sortie standard.

    Je ne sais pas comment revenir à l'état d'avant pour que les printfs fonctionnent normalement.

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    L'idée, plutôt que de fermer le flux ouvert par freopen, est de rouvrir le fichier qui va bien :
    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
    #ifdef WIN32
    /* le nom de la console est CON sous win32 */
    #define SORTIE_STANDARD "CON"
    #else
    /* le nom de la console souvent tty sous unixoïdes (1) */
    #define SORTIE_STANDARD "/dev/tty"
    #endif
    #include <stdio.h>
     
    int main(void)
    {
      printf("test - 1\n");
      freopen("out.now.txt", "w", stdout);
      printf("test - 2\n");
      freopen(SORTIE_STANDARD, "w", stdout);
      printf("test - 3\n");
     
      return 0;
    }
    Le défaut de cette solution est sa non-portabilité. À mon avis, il doit y avoir mieux.

    1 : testé seulement sur OS X.

  3. #3
    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 mabu Voir le message
    Le défaut de cette solution est sa non-portabilité. À mon avis, il doit y avoir mieux.
    Il n'y a pas de solution portable. Typiquement, si on utilise freopen() et que l'on doit revenir au flux precedent, c'est que le programme est mal pense. Il est alors preferable d'utiliser une variable (de type *FILE) qui pointe sur le flux qui va bien et de changer ce flux lors de l'avancement du programme.

    Voir ici pour plus de details.

  4. #4
    Membre très actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 138
    Par défaut
    En fait j'ai trouvé une solution (http://c-faq.com/stdio/undofreopen.html). Il faut joggler avec les dup, et dup2. C'est un peut de la magie noire, mais en tout cas sous windows cela fonctionne (d'apres le lien cela fonctionne aussi sous linux).

    code :
    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
     
    #include <stdio.h>
     
    main()
    {
        int    fd;
        fpos_t pos;
     
        printf("stdout, ");
     
        fflush(stdout);
        fgetpos(stdout, &pos);
        fd = dup(fileno(stdout));
        freopen("stdout.out", "w", stdout);
     
        f();
     
        fflush(stdout);
        dup2(fd, fileno(stdout));
        close(fd);
        clearerr(stdout);
        fsetpos(stdout, &pos);        /* for C9X */
     
        printf("stdout again\n");
    }
     
    f()
    {
    printf("stdout in f()");
    }
    En fait, je ne pouvais pas modifier les appels à printf, car mon programme génère du code assembleur compilé en mémoire, et rien que pour appeller printf cela m'a pris pas mal de temps.

    merci à tous.

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

Discussions similaires

  1. écrire sur stdout aprés un fork
    Par Ganondorf dans le forum Langage
    Réponses: 3
    Dernier message: 15/11/2007, 18h29
  2. [Log4j] Sortie sur STDOUT
    Par Slein dans le forum Wildfly/JBoss
    Réponses: 1
    Dernier message: 29/09/2007, 14h15
  3. Réponses: 1
    Dernier message: 06/12/2006, 20h59
  4. Réponses: 6
    Dernier message: 03/09/2006, 17h38
  5. Réponses: 3
    Dernier message: 15/03/2004, 00h55

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