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 :

Formattage de sortie


Sujet :

C

Vue hybride

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 331
    Par défaut Formattage de sortie
    J'ai fait une fonction pour gerer mes logs, et j'aimerai formatter ma chaine, afin que :
    - les 19 premiers caractères soit la date
    - 1 caractère d'espace
    - 1 caractère de code type erreur
    - 1 caractère d'espace
    - 20 caractères pour indiquer la source
    - N caractères pour le message d'erreur

    Actuellement, voici ma procédure:

    void Log(int typeLog, const char source[20], const char * msg)
    {
    char ch[20+1], * pcloc;
    struct tm * pdh; time_t intps; int nbc;

    intps=time(NULL); pdh = localtime(&intps);

    pcloc = setlocale( LC_TIME, "fr_FR");
    nbc = strftime( ch, 21, "%d/%m/%Y %H:%M:%S", pdh);

    #if defined(DEBUG)
    printf("\n%s %d %s %s", ch, typeLog, source, msg);
    #else

    #endif

    }
    Comment faire pour que mon printf respecte le nombre de caractères ?

  2. #2
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Comment faire pour que mon printf respecte le nombre de caractères ?
    En fait, je procéderait en plusieurs fois et ceci en passant par des sprintf (ou snprintf). Je pense notamment à cela pour la date.

    Le tout est d'écrire dans des chaines de taille fixe qui ensuite seront utilisées par ton printf final.

  3. #3
    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 PRomu@ld
    En fait, je procéderait en plusieurs fois et ceci en passant par des sprintf (ou snprintf). Je pense notamment à cela pour la date.

    Le tout est d'écrire dans des chaines de taille fixe qui ensuite seront utilisées par ton printf final.
    Pourquoi ? printf() n'est pas manchot... et strftime() fait déjà son travail...

  4. #4
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Pourquoi ?
    Parce que je n'aime pas les solutions uniques ! La programmation quelque soit le langage, c'est la liberté !

  5. #5
    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 PRomu@ld
    Parce que je n'aime pas les solutions uniques ! La programmation quelque soit le langage, c'est la liberté !
    De là à sortir une solution plus complexe que nécessaire, et de risquer un débordement de tableau supplémentaire, je ne vois pas trop l'intérêt.

  6. #6
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    De là à sortir une solution plus complexe que nécessaire, et de risquer un débordement de tableau supplémentaire, je ne vois pas trop l'intérêt.
    Le snprintf entre parenthèses n'était pas là pour rien ...

  7. #7
    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 kendras
    J'ai fait une fonction pour gerer mes logs, et j'aimerai formatter ma chaine, afin que :
    - les 19 premiers caractères soit la date
    - 1 caractère d'espace
    - 1 caractère de code type erreur
    - 1 caractère d'espace
    - 20 caractères pour indiquer la source
    - N caractères pour le message d'erreur

    Actuellement, voici ma procédure:



    Comment faire pour que mon printf respecte le nombre de caractères ?
    On utilise les formats. Il n'est pas inutile d'ouvrir son livre de C de temps en temps...

    Attention à bien faire une copie de la structure dont l'adresse est retournée par localtime(), sinon les valeurs peuvent être instables...
    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
     
    #include <time.h>
    #include <locale.h>
    #include <stdio.h>
     
    #define DEBUG
     
    static void Log (int typeLog, const char *source, const char *msg)
    {
    #if defined(DEBUG)
       char ch[20 + 1], *pcloc;
       int nbc;
     
       time_t intps = time (NULL);
       struct tm dh = *localtime (&intps);
     
       pcloc = setlocale (LC_TIME, "fr_FR");
       nbc = strftime (ch, sizeof ch, "%d/%m/%Y %H:%M:%S", &dh);
     
       printf ("%-19s %d %-20s %s\n", ch, typeLog, source, msg);
    #else
     
    #endif
     
    }
     
    int main ()
    {
       Log (9, "Hello world", "What the hell is going on ?");
       return 0;
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    21/06/2006 13:01:22 9 Hello world          What the hell is going on ?
     
    Press ENTER to continue.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 331
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    On utilise les formats. Il n'est pas inutile d'ouvrir son livre de C de temps en temps...
    Ce genre de commentaire.... vraiment....

    1. je n'ai pas de livre sur le C
    2. je navigue dans 3 tuto en pdf qui ne me fournissent pas toujours des réponses.
    3. rien ne m'empêche de chercher et de poser des questions sur le forum.

    Merci de faire preuve d'un peu de patience pour les newbies du C, ou de ne pas répondre tout simplement, si cela vous ennuis...

  9. #9
    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 kendras
    Ce genre de commentaire.... vraiment....
    1. je n'ai pas de livre sur le C
    C'est un tord. Des références sur ce site (ou sur le mien).

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 331
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    C'est un tord. Des références sur ce site (ou sur le mien).
    Vu le prix des livres....

    Puis écologiquement, je lutte pour la préservation des forêts...

  11. #11
    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 kendras
    Vu le prix des livres....

    Puis écologiquement, je lutte pour la préservation des forêts...
    Pas de problèmes :

    http://publications.gbdirect.co.uk/c_book/
    http://www.open-std.org/JTC1/SC22/WG...docs/n1124.pdf

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 331
    Par défaut
    Merci pour vos réponses

  13. #13
    Membre Expert

    Homme Profil pro
    Inscrit en
    Juillet 2003
    Messages
    2 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 2 075
    Par défaut
    Citation Envoyé par kendras
    Ce genre de commentaire.... vraiment....

    1. je n'ai pas de livre sur le C
    Eh bien va falloir investir 20€ dans le K&R par exemple non? Parce que "naviguer" entre 3 tutos sans manuel de référence ne me semble pas la panacée pour débuter...

  14. #14
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Hello,

    Citation Envoyé par kendras
    J'ai fait une fonction pour gerer mes logs, et j'aimerai formatter ma chaine, afin que :
    - les 19 premiers caractères soit la date
    - 1 caractère d'espace
    - 1 caractère de code type erreur
    - 1 caractère d'espace
    - 20 caractères pour indiquer la source
    - N caractères pour le message d'erreur

    Actuellement, voici ma procédure:



    Comment faire pour que mon printf respecte le nombre de caractères ?
    C'est un bon début. Ceci dit, il faudrait ajouter quelques tests pour les fonction de date et de formatage de date (strftime()), ne sait-on jamais. Pour ce qui est de la modif de la "locale" pour le temps, c'est bien pensé, mais il faut pouvoir revenir à l'ancienne locale précédemment positionnée. Ici tu ne modifies que ce qui affecte le temps, mais si jamais tu dois formater des données autres (valeurs entieres representant de l'argent), tu aurais pu avoir des surprises avec setlocale(LC_ALL, ...). En général, la gestion de la "locale" se fait en début de programme puis on n'y touche plus après. Pour ce qui est du localtime(), j'ai regardé le post d'Emmanuel concernant son instabilité, il faut que je me renseigne (je n'ai encore pas rencontré de problème avec sans faire de copie). Enfin, pour le printf() :
    - il faut spécifier une précision <PREC> avec les chaines de caractères ("%.<PREC>s" )pour limiter le nombre de caractères à écrire. C'est assez tordu car il s'agit pour la plupart des autres spécificateurs de format d'une taille minimale.
    - Si typeLog doit être représenté par un seul caractère, pourquoi ne pas utiliser le type char ? (Si tu veux garder en int, y'a pas moyen de dire à printf() de l'afficher sur un seul caractère avec "%d", tandis qu'avec un char, tu as "%c" et c'est tout bon).


    Mon 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    void Log(char typeLog, const char * source, const char * msg)
    {
       char ch[20+1];
       char * pLocale = NULL;
       struct tm * pLocTime = NULL; 
       time_t calTime;
     
       if ( (calTime=time(NULL)) != (time_t)-1 && (pLocTime = localtime(&calTime) ) )
       {
          char * pBackupLocale = setlocale(LC_TIME, NULL);
          /* bon, j'assume que c'est OK, je ne teste pas le retour */
          (void)setlocale( LC_TIME, "fr_FR");
     
          if ( strftime( ch, 20, "%d/%m/%Y %H:%M:%S", pLocTime) ) {
             printf("\n%.19s %c %.20s %s", ch, typeLog, source, msg);
          }
         (void)setlocale( LC_TIME, pBackupLocale);
       }
    } 
     
    [...]
     
    Log('E', "criticaldaemon", "Oh No !!!! Foobar1329 inside !");
    Log('W', "criticaldaemon", "can't do rm -rf /dev");
    Log('W', "criticaldaemon", "httpd daemon killed");
    Log('E', "criticaldaemon", "Big system failure");
     
    [...]
    A+

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

Discussions similaires

  1. spool et formattage du texte a la sortie
    Par hoolako dans le forum SQL
    Réponses: 2
    Dernier message: 31/07/2009, 12h18
  2. SQL*Plus et formattage des données de sortie
    Par XtoX dans le forum Sql*Plus
    Réponses: 7
    Dernier message: 06/11/2007, 13h13
  3. [LG]Entrées et sorties redirigée
    Par Lady dans le forum Langage
    Réponses: 17
    Dernier message: 10/05/2003, 18h33
  4. Rediriger le plux de sortie
    Par Groove dans le forum C
    Réponses: 5
    Dernier message: 17/04/2003, 17h16
  5. récupérer la valeur de sortie d'un thread
    Par jakouz dans le forum Langage
    Réponses: 3
    Dernier message: 31/07/2002, 11h28

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