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 :

problème Time [Débutant(e)]


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 46
    Par défaut problème Time
    Bonsoir,
    Je souhaiterais créer un petit programme qui m'écrit l'heure (avec le décalage horaire si possible) et la date courante dans un fichier.
    Pour ce faire, j'ai utilisé la biblio time.h et la FAQ. J'arrive à ça (je m'occuperai de la gestion des erreurs plus tard):
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #include <errno.h>
    #include <time.h>
     
    int main(int argc, char **argv )
    {
        FILE *eekotsi;
        struct tm *t;
        time_t timestamp;
     
        time(&timestamp);
        t = gmtime(&timestamp);
        eekotsi = fopen("eekotsi.dat", "w");
        fprintf(eekotsi,"%d-%d-%d-%d-%d-%d\n", 1900+t -> tm_year, 1+t -> tm_mon, t -> tm_mday, 2+t -> tm_hour, t -> tm_min, t -> tm_sec);
        fclose(eekotsi);  
    }
    Mon petit problème vient du fait que je fais la mise à jour à l'heure local "manuellement" (je suis en Finlande c'est pourquoi le +2 mais ce n'est pas important). Y-a-t-il un moyen plus astucieux d'obtenir l'heure locale (sans utiliser l'api windows comme dit dans la FAQ). Ensuite, je souhaiterais que la date soit écrit de cette manière : yyyy-mm-dd-hh-mm-ss ce qui n'est pas le cas quand le nombre commence par un 0, comment gérer ce problème?
    Je voudrais également votre avis sur un point : si je souhaitais plus tard lire cette date et la comparer avec la date courante par exemple, comment me conseilleriez vous de lire le fichier eekotsi.dat afin de stoquer l'ancienne date.

    J'espère avoir été clair dans mes questions, je compte sur vous.
    Merci d'avance.
    Jo

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    3 questions dans le même thread, cool

    1/ affichage formatté
    printf("%4d", val) affiche sur 4 caractères même si la valeur commence par un 0. Le 4 indique le nombre minimum de caractère à utiliser. man printf te donnera plein d'informations sur les format d'affichage. Ici par exemple http://www.linux-france.org/article/.../printf-3.html. C'est du linux mais c'est aussi valable pour Microsoft.

    2/ Je pense que ton code à des problèmes aux limites. En effet, à 23H00 GMT, ton code affichera 25H00 (l'effet de ton +2) ce qui n'est pas ce que tu veux je suppose. Pour cela, il faut que tu utilise l'appel localtime() qui fonctionne comme gmttime() mais te renseigne la structure struct tm *t avec des valeurs locales.

    3/ Pour stocker la date afin de la comparer ultérieurement, je sauvegarderai au format binaire la valeur de time_t timestamp. Attention l'ouverture du fichier, l'écriture et la fermeture ne sont plus les mêmes puisque c'est du binaire. Il faut utiliser open(), write() et close().
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 46
    Par défaut
    Citation Envoyé par ram_0000 Voir le message
    3 questions dans le même thread, cool
    2/ Je pense que ton code à des problèmes aux limites. En effet, à 23H00 GMT, ton code affichera 25H00 (l'effet de ton +2) ce qui n'est pas ce que tu veux je suppose. Pour cela, il faut que tu utilise l'appel localtime() qui fonctionne comme gmttime() mais te renseigne la structure struct tm *t avec des valeurs locales.
    Effectivement, je n'avais même pas fait attention à ça... Je suis un boulet xD. le local time marche très bien, merci .

    Citation Envoyé par ram_0000 Voir le message
    3/ Pour stocker la date afin de la comparer ultérieurement, je sauvegarderai au format binaire la valeur de time_t timestamp. Attention l'ouverture du fichier, l'écriture et la fermeture ne sont plus les mêmes puisque c'est du binaire. Il faut utiliser open(), write() et close().
    En fait, le stockage de la date n'est qu'une petite partie de ce que je veux faire. Mon but est de faire quelquechose qui s'apparenterait à un tamagoshi. Le fichier dat ne contiendra pas uniquement la date mais une info par ligne. Par exemple, la date, le nom, son degré de faim, de fatigue etc. Ma question serait plutôt, si je lis le fichier et que je veux tester, puis stocker le contenu de ma première ligne (qui sera la date) afin de faire ma difference de temps par la suite, quelle serait la meilleur façon de m'y prendre? J'avais pensé à quelquechose comme utiliser fgetc et mettre le contenu de la ligne dans un tableau mais il doit y avoir une manière plus élegante.
    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
     
    char c;
    int i=0;
    char line[4]; //le fichier dat fait 5 lignes
            while ( c != EOF )
            {
                while ( c != '\n' ) // avec ça je pense stoquer le contenu de chaque 
    //ligne comme chaîne à chaque indice de line mais je doute que cela 
    //fonctionne correctement car il va surement ajouter les valeurs de c non?
                {
                    c = fgetc(eekotsi);
                    line[i]=line[i]+c;
                }
            i++
            }

  4. #4
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Normal tu utilises gmtime qui donne l'heure UTC au lieu de localtime qui donne l'heure local. Utilise donc localtime.
    Citation Envoyé par ram_0000
    printf("%4d", val) affiche sur 4 caractères même si la valeur commence par un 0.
    non il faut utiliser le format %04d (et non %4d) si on veut compléter par des 0 les chiffres non significatifs manquants ...
    Citation Envoyé par ram_0000
    Pour cela, il faut que tu utilise l'appel localtime() qui fonctionne comme gmttime() mais te renseigne la structure struct tm *t avec des valeurs locales.
    Euh ... c'est gmtime et non gmttime.
    Citation Envoyé par ram_0000
    Attention l'ouverture du fichier, l'écriture et la fermeture ne sont plus les mêmes puisque c'est du binaire. Il faut utiliser open(), write() et close().
    Il n'y a aps de open, write et close en C. Tu veux peut-être parler de fopen, fwrite et fclose.

  5. #5
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par jocelyn54
    Le fichier dat ne contiendra pas uniquement la date mais une info par ligne. Par exemple, la date, le nom, son degré de faim, de fatigue etc.
    Ton fichier dat est donc un fichier texte puisqu'il est organisé en lignes. fgets permet de lire une ligne dans un fichier texte. Puisque chaque ligne respecte un format bien défini, tu peux utiliser sscanf pour analyser chaque ligne lue pour en extraire les informations que tu as besoin.

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par Melem Voir le message
    non il faut utiliser le format %04d (et non %4d) si on veut compléter par des 0 les chiffres non significatifs manquants ...
    le format "%4d" complète avec des espaces les chiffres non significatifs manquants
    le format "%04d" complète avec des 0 les chiffres non significatifs manquants
    le format "%.4d" complète avec des 0 les chiffres non significatifs manquants
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  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 jocelyn54 Voir le message
    Mon petit problème vient du fait que je fais la mise à jour à l'heure local "manuellement" (je suis en Finlande c'est pourquoi le +2 mais ce n'est pas important). Y-a-t-il un moyen plus astucieux d'obtenir l'heure locale (sans utiliser l'api windows comme dit dans la FAQ). Ensuite, je souhaiterais que la date soit écrit de cette manière : yyyy-mm-dd-hh-mm-ss ce qui n'est pas le cas quand le nombre commence par un 0, comment gérer ce problème?
    Utilise localtime() et strftime(), c'est fait pour.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    2008-01-16-12-12-20
     
    Press ENTER to continue.
    avec :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    int main (void)
    {
       time_t timestamp;
     
       time (&timestamp);
     
       /* -ed- je conseille de faire une copie locale : */
       {
          struct tm *pt = localtime (&timestamp);
          if (pt != NULL)
          {
             struct tm t = *pt;
             char sdate[64];
             /* yyyy-mm-dd-hh-mm-ss */
             strftime (sdate, sizeof sdate - 1, "%Y-%m-%d-%H-%M-%S", &t);
             {
                FILE *eekotsi = fopen ("eekotsi.dat", "w");
                if (eekotsi != NULL)
                {
                   fprintf (eekotsi, "%s\n", sdate);
                   fclose (eekotsi);
                   /* Windows */
                   system ("type eekotsi.dat");
                }
             }
          }
       }
       return 0;
    }

  8. #8
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 46
    Par défaut
    Merci à tous pour votre aide, ça m'a beaucoup aidé.

  9. #9
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 46
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
          struct tm *pt = localtime (&timestamp);
          if (pt != NULL)
          {
             struct tm t = *pt;
             char sdate[64];
             /* yyyy-mm-dd-hh-mm-ss */
             strftime (sdate, sizeof sdate - 1, "%Y-%m-%d-%H-%M-%S", &t);
           }
    J'aurais besoin d'une dernière chose, dans cet exemple, on utilise strftime afin de formater la date et le stocker dans un tableau de char comme dans la faq. Je voudrais savoir si l'inverse est possible, je dispose d'un tableau de char avec la date écrit dans un certain format : "%Y-%m-%d-%H-%M-%S" et je souhaiterais mettre ces info dans une structure de temps.
    J'avais pensé à une méthode un peu "Bourrine" et vraiment pas belle qui consisterait à remettre chaque élément de la date dans un autre tableau puis de les convertir en entier et de créer une nouvelle structure de temps mais je pense qu'il doit y avoi mieux à faire non?

  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 jocelyn54 Voir le message
    Je voudrais savoir si l'inverse est possible, je dispose d'un tableau de char avec la date écrit dans un certain format : "%Y-%m-%d-%H-%M-%S" et je souhaiterais mettre ces info dans une structure de temps.
    J'avais pensé à une méthode un peu "Bourrine" et vraiment pas belle qui consisterait à remettre chaque élément de la date dans un autre tableau puis de les convertir en entier et de créer une nouvelle structure de temps mais je pense qu'il doit y avoi mieux à faire non?
    Non. Il n'y a pas de parser standard, car pour une date binaire (struct tm) il peut y avoir des dizaines de formats textes... Ce serait infernal... C'est à toi d'écrire le parseur pour une application donnée.

    Si le format n'est pas régulier, ça peut vite être complexe...

  11. #11
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 46
    Par défaut
    ok merci

  12. #12
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 46
    Par défaut
    Pardon, j'ai encoe un dernier petit problème. C'est tout bête mais je n'arrive pas à en trouver la raison .
    J'ai essayé de faire ce que j'ai dit plus tôt. Je veux stocker les valeurs du tab date qui m'interessent dans d'autres tableaux puis les convertir par la suite
    Voici mon 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
     
    char temp[200], date[20], year[4], mon[2], day[2], hour[2], min[2], sec[2];
    // date formaté de cette manière : yyyy-mm-dd-hh-mm-ss
                fgets(date,21,eekotsi);
                fclean(date,eekotsi);
                for (int i=0; i<4; i++)
                {
                    year[i]=date[i];
                }
                mon[0]=date[5]; mon[1]=date[6];
                day[0]=date[8]; day[1]=date[9];
                hour[0]=date[11]; hour[1]=date[12];
                min[0]=date[14]; min[1]=date[15];
                sec[0]=date[17]; sec[1]=date[18];
     
                printf("%s\n",date);
                printf("year: %s\n",year);
                printf("mon: %s\n",mon);
                printf("day: %s\n",day);
                printf("hour: %s\n",hour);
                printf("min: %s\n",min);
                printf("sec: %s\n",sec);
    Quand je regarde le résultat, je suis surpris. En effet, pour la date : 2008-01-16-12-27-02, j'obtiens les affichages suivants pour mes tableaux:
    year: 2008
    mon: 012008
    day: 16012008
    et ainsi de suite ce qui pose problème... voyez vous d'où cela peut venir?

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

Discussions similaires

  1. Problème Time supérieur à 24:00:00
    Par mguidez dans le forum Général Java
    Réponses: 5
    Dernier message: 14/01/2013, 20h30
  2. Problème Time Picker
    Par flyer74 dans le forum Android
    Réponses: 0
    Dernier message: 28/01/2012, 18h49
  3. Réponses: 2
    Dernier message: 27/05/2009, 10h33
  4. [Daqmx] Problème timing
    Par zinzaf dans le forum LabVIEW
    Réponses: 1
    Dernier message: 15/06/2008, 11h53
  5. problème timing dans multithread
    Par goof_22 dans le forum C++
    Réponses: 1
    Dernier message: 30/10/2006, 15h10

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