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 :

redéfinir la sortie standard


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 118
    Par défaut redéfinir la sortie standard
    Bonjour,

    Est il possible de faire cela (je ne pense pas, mais bon...) :

    Je souhaite redéfinir la sortie standard afin que les printf et fprintf d'un programme s'inscrive dans deux fichiers (par exemple) différents.

    Explication :
    J'ai un programme A.c qui contient des printf. J'utilise les méthode de A.c dans le programme B.c. Dans le programme B.c, j'aimerais pouvoir récupérer les erreurs (et les traiter selon le message d'erreur) générées par A.c.
    Pour cela, je souhaite envoyer les printf dans le fichier std.log et les fprintf dans le fichier std.err.

    Si quelqu'un sait comment faire cela...
    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Mais fprintf te permet de redéfinir la sortie, soit console, soit fichier, c'est le premier argument. Quant à printf, tu ne peux pas à ce que j'en sais, elle sort directement sur stdout.

    Le mieux et le plus simple est encore de faire ses propres fonctions, un sorte de wrapper de fprintf si tu veux qui se charge d'ouvrir un fichier et d'écrire dedans !

    Une constante en premier argument du wrapper permettrais de définir sur quel fichier tu veux écrire ... ce n'est que des idées comme ca à froid !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Salut,

    Euh, je crois que tu peux fermer les différentes sorties standard (in, out et erreur), et ensuite ouvrir ton fichier. Comme ça il se verra attribuer le numéro correspondant à la sortie standard.

    Je ne sais pas si j'ai été très clair ?
    Et je dis ça sans en être totalement sûr, je crois me souvenir que j'avais fait ça à la fac, mais ça remonte à quelques années, alors...

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Je ne demande qu'à voir ca, au moins j'aurais appris quelque chose
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 118
    Par défaut
    Citation Envoyé par Franck.H
    Le mieux et le plus simple est encore de faire ses propres fonctions, un sorte de wrapper de fprintf si tu veux qui se charge d'ouvrir un fichier et d'écrire dedans !

    Une constante en premier argument du wrapper permettrais de définir sur quel fichier tu veux écrire ... ce n'est que des idées comme ca à froid !
    Le problème est que je ne peux pas modifier le programme qui contient les printf ou les fprintf(stderr)...
    Il faudrait que je puisse modifier les sorties, à l'éxterieur du fichier...

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    Rediriger les sorties avec les arguments de la ligne de commande ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./a.out >std.log 2>std.err
    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.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 118
    Par défaut
    Citation Envoyé par zooro

    Euh, je crois que tu peux fermer les différentes sorties standard (in, out et erreur), et ensuite ouvrir ton fichier. Comme ça il se verra attribuer le numéro correspondant à la sortie standard.
    Oui, c'est quelque chose comme ça qu'il me faudrait...

  8. #8
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Comme le fait la SDL en fait !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 118
    Par défaut
    Citation Envoyé par Médinoc
    Rediriger les sorties avec les arguments de la ligne de commande ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./a.out >std.log 2>std.err
    Non, cela n'est pas possible car je n'appelle pas ces programmes en ligne de commande car je pilote ces programmes c par un autre langage de programmation

  10. #10
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Citation Envoyé par Franck.H
    Je ne demande qu'à voir ca, au moins j'aurais appris quelque chose
    J'ai trouvé ça sur le net:
    Citation Envoyé par http://sardes.inrialpes.fr/~bouchena/teaching/SR/TP3.html
    La primitive dup sert à dupliquer un descripteur de fichier en utilisant le plus petit numéro de descripteur non utilisé. Elle prend en argument un descripteur de fichier ouvert et retourne le descripteur de la copie. Pour rediriger la sortie standard à l'écran (respectivement l'entrée standard au clavier), l'idée est de fermer le descripteur 1 (respectivement 0), puis de faire dup sur le descripteur qui deviendra la nouvelle sortie standard (respectivement la nouvelle entrée standard). Dans les deux cas, il ne faudra pas oublier de fermer également le descripteur original (celui qu'on vient de dupliquer), puisqu'il ne sert alors plus à rien.
    Bon, c'est pour rediriger les entrées/sorties sur/vers des tubes (pipes), mais ça devrait être utilisable pour des fichiers aussi...

  11. #11
    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
    Tu peux faire un freopen() sur stdout.

  12. #12
    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 alex'l
    Oui, c'est quelque chose comme ça qu'il me faudrait...
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void)
    {
        FILE *f = fopen("redir.txt","w");
        int fd;
     
        if(f==NULL)
            return EXIT_FAILURE;
     
        fd = fileno(f);
     
        //Fermeture de la sortie standard
        close(1);
     
        //Duplication de fd
        dup(fd);
     
        //Fermeture de f
        fclose(f);
     
        printf("Hello world\n");
        return EXIT_SUCCESS;
    }
    Cela fonctionne sous linux,
    Jc

    [EDIT]
    -DaZumba a raison, freopen est nettement mieux est portable, voir ci-dessous pour une solution plus propre...
    -Je laisse cette solution parce que c'est ce qu'on fait lorsqu'on veut rediriger une sortie vers un pipe nommé sous linux... -> quoique pourrait-on utiliser freopen sur un pipe nommé, je ne vois pas pourquoi pas... Il faudrait tester
    -Par contre, dup est utile lorsqu'on veut rediriger vers un tube rendu par la fonction pipe...
    [/EDIT]

  13. #13
    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 DaZumba
    Tu peux faire un freopen() sur stdout.
    J'ai tendance à l'oublier celui-là

    C'est en effet portable et plus propre :
    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>
     
    int main(void)
    {
        FILE *f = freopen("redir.txt","w",stdout);
     
        if(f==NULL)
            return EXIT_FAILURE;
     
        printf("Hello world\n");
        return EXIT_SUCCESS;
    }
    Jc

  14. #14
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Oui c'est en effet plus propre
    Je n'aurais jamais pensé que c'était aussi simple
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  15. #15
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Ben pour le coup, c'est moi qui ai appris quelque chose !
    Je ne connaissais pas freopen() !

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 118
    Par défaut
    excellent, je vais tester ça très bientot...

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 118
    Par défaut
    bon et bien je viens de tester (sous windows) et ça marche très bien!!! Il faudra que je teste sous unix...
    Moi qui pensai que ce n'était pas possible...

    Merci beaucoup

  18. #18
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par alex'l
    bon et bien je viens de tester (sous windows) et ça marche très bien!!! Il faudra que je teste sous unix...
    Moi qui pensai que ce n'était pas possible...

    Merci beaucoup
    Possible si, ca je le savais car la SDL le fait par défaut !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  19. #19
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par fearyourself
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void)
    {
        FILE *f = fopen("redir.txt","w");
        int fd;
     
        if(f==NULL)
            return EXIT_FAILURE;
     
        fd = fileno(f);
     
        //Fermeture de la sortie standard
        close(1);
     
        //Duplication de fd
        dup(fd);
     
        //Fermeture de f
        fclose(f);
     
        printf("Hello world\n");
        return EXIT_SUCCESS;
    }
    Inutilement compliqué, mais y a de l'idée puisse qu'avec cette méthode, tu peux sauvegarder stdout et le remettre en place une fois que tu as fini la redirection, ce qui n'est pas possible en standard.

  20. #20
    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 gege2061
    Inutilement compliqué, mais y a de l'idée puisse qu'avec cette méthode, tu peux sauvegarder stdout et le remettre en place une fois que tu as fini la redirection, ce qui n'est pas possible en standard.
    Si c'est possible, mais ce n'est pas portable.

    DOS/Windows (pseudo-code) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    freopen("redir.txt","w",stdout);
    <...>
    freopen("con","w",stdout);
    Sous unixoide, la console doit bien avoir aussi un petit nom genre "/dev/laconsole" ...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. PB sortie standard avec les PTHREAD !!!
    Par djspit dans le forum C++
    Réponses: 15
    Dernier message: 19/11/2004, 01h17
  2. [langage] sortie standard linux
    Par ebaynaud dans le forum Langage
    Réponses: 8
    Dernier message: 14/10/2004, 08h05
  3. rediriger la sortie standard vers un textarea
    Par gromite dans le forum Composants
    Réponses: 9
    Dernier message: 10/05/2004, 11h07
  4. Réponses: 5
    Dernier message: 24/12/2003, 09h49
  5. Réponses: 16
    Dernier message: 18/07/2003, 17h16

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