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 :

Lecture d'une date


Sujet :

C

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 273
    Points : 150
    Points
    150
    Par défaut Lecture d'une date
    Salut,

    Je cherche a mettre en place un petit programme qui consisterait a déterminer si un certain temps est passé entre une date et une autre
    Par exemple : j'ai un fichier contenant plusieurs informations, dont une ligne qui contient la date, j'aimerais que le programme puisse lire cette date, la comparer avec celle de l'ordinateur (ou d'internet) et qu'il puisse dire si cette date est déjà passée (j'ai commencé en langage C, je me demande donc si c'est possible avec ce langage, étant donné que c'est un langage d'assez bas niveau je me suis dit que quelque chose comme ça ne devrait pas trop poser de problèmes)

    Quelqu'un a une idée de comment faire ça ?

    Merci d'avance

  2. #2
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2015
    Messages : 6
    Points : 13
    Points
    13
    Par défaut
    Bonjour a toi,

    Si je me trompe pas regarde du coté de time. ctime.h il y a des fonction bien intéressante pour ce que tu veux faire.

    Commence par parser ce fichier dans un double tableau puis une foix que tu aura la case de ton tableau contenant la date utilise une des fonctions de time.h

    Si tu as besoin de plus d'information n’hésite pas.

  3. #3
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    comme dit apparence il faut regarder dans time.h, plus particulièrement ce qui t'intéresses c'est la fonction strptime()

  4. #4
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Bonjour,
    à quoi ressemble la date dans ton fichier ? En fait, à quoi ressemble ton fichier …

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 273
    Points : 150
    Points
    150
    Par défaut
    Pour être plus précis :

    Je suis censé avoir un fichier .txt avec une date écrite dedans (avec pour format par exemple : 2015-08-28) je voudrais que mon programme :

    1 - récupère cette date sous forme de chaîne de caractères.
    2 - qu'elle soit convertie en format date (pour pouvoir l'exploiter avec la date actuelle).
    3 - définir le nombre de jours\heures qui sont écoulés de la date récupérée dans le fichier et celle actuelle (pour ensuite pouvoir dire si cette date est passée ou pas).

    time.h ? j'ai regardé de ce coté et j'ai "juste" trouver des méthodes pour gérer la date, mais j'avoue que j'ai un peu de mal à comprendre quel processus je dois exactement mettre en place afin d'atteindre ce résultat...

    Commence par parser ce fichier dans un double tableau puis une foix que tu aura la case de ton tableau contenant la date utilise une des fonctions de time.h
    Tu pourrais me détailler un peu plus cette méthode ?

    comme dit apparence il faut regarder dans time.h, plus particulièrement ce qui t'intéresses c'est la fonction strptime()
    Comment je devrais la mettre en place exactement ?

    Merci

  6. #6
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par danieldou Voir le message
    Comment je devrais la mettre en place exactement ?
    avec les doigts, en allant lire la doc d'abord

  7. #7
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 273
    Points : 150
    Points
    150
    Par défaut
    (je vais lire en détail le lien que tu m'a envoyé )

    en attendant j'ai réussi a avancer un peu :

    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
    main()
    {
    char date[] = "2015-08-26";
    date[4] = date[7] = '\0';
    struct tm tmdate = {0};
    tmdate.tm_year = atoi(&date[0]) - 1900;
    tmdate.tm_mon = atoi(&date[5]) - 1;
    tmdate.tm_mday = atoi(&date[8]);
    time_t t = mktime( &tmdate );
    time_t t2 = time(NULL);
    printf("\n\nAffichage de la date certificat\n\n");
    printf("%s\n", ctime(&t));
    printf("Affichage de la date d\'aujourd\'hui\n\n");
    printf("%s", ctime(&t2));
    getch();
    }
    Vous en pensez quoi ?
    (sauf que maintenant je bloque au niveau du fichier...)

  8. #8
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Citation Envoyé par danieldou Voir le message
    Pour être plus précis :

    Je suis censé avoir un fichier .txt avec une date écrite dedans (avec pour format par exemple : 2015-08-28)
    Tu n'as aucune idée du format de la date que tu vas avoir à traiter ?
    Citation Envoyé par danieldou Voir le message

    je voudrais que mon programme :

    1 - récupère cette date sous forme de chaîne de caractères.
    Si tu ne connais pas le format ce sera difficile. Sinon rien de compliqué si tu sais ouvrir et lire dans le fichier.
    Citation Envoyé par danieldou Voir le message
    2 - qu'elle soit convertie en format date (pour pouvoir l'exploiter avec la date actuelle).
    3 - définir le nombre de jours\heures qui sont écoulés de la date récupérée dans le fichier et celle actuelle (pour ensuite pouvoir dire si cette date est passée ou pas).
    [...]
    Si c'est juste pour savoir si la date est ou non passée tu peux comparer directement des chaînes de caratères si tu les as au format YYYYMMDD, pas la peine de faire de longs calculs.

  9. #9
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 273
    Points : 150
    Points
    150
    Par défaut
    Citation Envoyé par picodev Voir le message
    Tu n'as aucune idée du format de la date que tu vas avoir à traiter ?
    En fait le format de la date m'importe peu parce que le fichier sera généré par un autre programme de moi, du coup faut juste que je choisisse le même format pour les deux, pour le moment je me suis fixé celui que j'ai mis en exemple : 2015-08-28

    Citation Envoyé par picodev Voir le message
    Si tu ne connais pas le format ce sera difficile. Sinon rien de compliqué si tu sais ouvrir et lire dans le fichier.
    Justement... en théorie je pensais le faire facilement mais apparemment je bloque aussi la dessus :/

    Citation Envoyé par picodev Voir le message
    Si c'est juste pour savoir si la date est ou non passée tu peux comparer directement des chaînes de caractères si tu les as au format YYYYMMDD, pas la peine de faire de longs calculs.
    comment ça ? tu veux dire qu'il y aurait un moyen de savoir si la date est dépassée en comparant deux chaines de caractère ? (dans ce cas il faudrait juste convertir la date en char, il me semble que ça sera beaucoup plus simple)

    Merci

  10. #10
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Citation Envoyé par danieldou Voir le message
    [...]
    comment ça ? tu veux dire qu'il y aurait un moyen de savoir si la date est dépassée en comparant deux chaines de caractère ? (dans ce cas il faudrait juste convertir la date en char, il me semble que ça sera beaucoup plus simple)

    Merci
    Prend une date dans une chaîne de caractère au format YYYYMMDD (exactement 4 caractères pour l'année, exactement 2 pour le mois et exactement 2 pour le jour). La comparaison lexicographique donne le même résultat qu'une comparaison numérique, tu peux même y ajouter des séparateurs tant que tu as toujours les mêmes aux mêmes endroits. Par exemple "2005/12/01" < "2005/12/02" < "2015/01/01" ...

  11. #11
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 273
    Points : 150
    Points
    150
    Par défaut
    donc on peux comparer 2 char aux mêmes formats et savoir si la date est dépassée ?
    mais avec quelle fonction je fait la comparaison ? la fonction difftime est spécialement dédiée a la date non ?

    merci

  12. #12
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Oui on peut, simplement car dans tous les encodages actuellement utilisés (à ma connaissance) on a la propriété : "0" < "1" < "2" < "3" < "4" < "5" < "6" < "7" < "8" < "9".
    Pour comparer deux chaînes tu peux utiliser strcmp ou strncmp puisque tu connais a priori la longueur de tes chaînes.

  13. #13
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 273
    Points : 150
    Points
    150
    Par défaut
    je vais approfondir ce que tu me conseille, je renverrais un message demain soir pour te tenir au courant ^^

    Merci encore

  14. #14
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    un exemple d'utilisation de strptime() :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #define _XOPEN_SOURCE
    #include <stdio.h>
    #include <time.h>
     
    char *jour[] = {"dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"};
     
    int main (void) {
       char date[] = "2015-08-28";
       struct tm tm = {0};
       strptime(date, "%Y-%m-%d", &tm);
       printf ("c'était un %s\n", jour[tm.tm_wday]);
       return 0;
    }
    (on constate donc qu'en fournissant uniquement le jour, le mois et l'année le membre tm_wday indiquant le jour de la semaine est rempli automatiquement)

    son pendant est la fonction strftime() qui prend en paramètre une structure tm et un format pour retourner la date selon le format qu'on souhaite, ainsi avec un format "%Y%m%d" on retombe sur la solution proposée par picodev, reste plus qu'à faire un strncmp() par dessus, ou alors également avec "%s" pour retourner un timestamp qu'on pourra passer à la moulinette de ssprintf ou ato{i,l} par exemple

  15. #15
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 273
    Points : 150
    Points
    150
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    un exemple d'utilisation de strptime() :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #define _XOPEN_SOURCE
    #include <stdio.h>
    #include <time.h>
     
    char *jour[] = {"dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"};
     
    int main (void) {
       char date[] = "2015-08-28";
       struct tm tm = {0};
       strptime(date, "%Y-%m-%d", &tm);
       printf ("c'était un %s\n", jour[tm.tm_wday]);
       return 0;
    }
    (on constate donc qu'en fournissant uniquement le jour, le mois et l'année le membre tm_wday indiquant le jour de la semaine est rempli automatiquement)

    son pendant est la fonction strftime() qui prend en paramètre une structure tm et un format pour retourner la date selon le format qu'on souhaite, ainsi avec un format "%Y%m%d" on retombe sur la solution proposée par picodev, reste plus qu'à faire un strncmp() par dessus, ou alors également avec "%s" pour retourner un timestamp qu'on pourra passer à la moulinette de ssprintf ou ato{i,l} par exemple
    J'ai testé ton code et voila ce que la console m'affiche.. :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Process returned 1 <0x1>   execution time : 0.005 s
    Press any key to continue.
    du coup en attendant j'ai testé quelques trucs de mon coté :

    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
    main()
    {
    int secondes;
    char date[] = "2015-08-30";
    date[4] = date[7] = '\0';
    struct tm tmdate = {0};
    tmdate.tm_year = atoi(&date[0]) - 1900;
    tmdate.tm_mon = atoi(&date[5]) - 1;
    tmdate.tm_mday = atoi(&date[8]);
    time_t t_c = mktime( &tmdate );
    time_t t_a = time(NULL);
    printf("\n\nAffichage de la date certificat\n\n");
    printf("%s\n", ctime(&t_c));
    printf("Affichage de la date d\'aujourd\'hui\n\n");
    printf("%s\n", ctime(&t_a));
    secondes = difftime(t_a, mktime(&tmdate));
    printf("%d\n\n", secondes);
    if (secondes > 0)
    {
        printf("Expir%c", 130);
    }
    else
    {
        printf("Non expir%c", 130);
    }
    getch();
    }
    Vous en pensez quoi ? (peut être pas très propre non ?) mais il me manque un petit détail, j'aimerais améliorer ce code pour y rajouter l'heure

    quelqu'un saurait comment ?

    EDIT : Réussi !

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    int main(int argc, char *argv[])
    {
        char test[1000];
        int secondes;
        FILE*fichier = NULL;
     
        if ((fichier=fopen("test.cert", "r+"))== NULL)
        {
            printf("Error! opening file");
           exit(1);
        }
        else
        {
            fscanf(fichier,"%[^\n]",test);
            printf("Data from file:\n%s",test);
            fclose(fichier);
        }
     
    test[4] = test[7] = '\0';
    struct tm tmdate = {0};
    tmdate.tm_year = atoi(&test[0]) - 1900;
    tmdate.tm_mon = atoi(&test[5]) - 1;
    tmdate.tm_mday = atoi(&test[8]);
    tmdate.tm_hour = atoi(&test[11]) - 1;
    tmdate.tm_min = atoi(&test[14]);
    tmdate.tm_sec = atoi(&test[17]);
    time_t t_c = mktime(&tmdate);
    time_t t_a = time(NULL);
    printf("\n\nAffichage de la date certificat\n\n");
    printf("%s\n", ctime(&t_c));
    printf("Affichage de la date d\'aujourd\'hui\n\n");
    printf("%s\n", ctime(&t_a));
    secondes = difftime(t_a, mktime(&tmdate));
    printf("%d\n\n", secondes);
    if (secondes > 0)
    {
        printf("Expir%c", 130);
    }
    else
    {
        printf("Non expir%c", 130);
    }
    getch();
    return 0;
    Merci beaucoup pour votre aide

  16. #16
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par danieldou Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Process returned 1 <0x1>   execution time : 0.005 s
    Press any key to continue.
    ok, j'ai présumé -à tort- que tu devais coder sous Linux comme la plupart des étudiants du coin, my bad
    strptime() n'est pas accessible partout, et notamment pas sous Windows

    une méthode moins sale que celle que tu utilises, dans la continuité de ce que te proposait picodev plus haut :
    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 <time.h>
     
    int main (void) {
       char date[] = "2015-08-29";
       char d1[9] = {0}, d2[9] = {0};
       int jour, mois, annee;
       time_t t1;
       struct tm *t2;
     
       sscanf(date, "%4d-%2d-%2d", &annee, &mois, &jour);
       sprintf(d1, "%4d%02d%02d", annee, mois, jour);
     
       t1 = time(NULL);
       t2 = localtime(&t1);
       strftime(d2, sizeof(d2), "%Y%m%d", t2)
     
       printf ("%s %s %s\n", d1, (strncmp(d1, d2, 8) > 0) ? "est après" : "est avant (ou le même jour que)", d2);
       return 0;
    }

  17. #17
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 273
    Points : 150
    Points
    150
    Par défaut
    J'ai testé ton code mais (excusez ma nullité x)) j'ai un peu de mal a le comprendre (encore débutant en C) j'aimerais bien le comprendre histoire de progresser
    Et puis j'ai vu qu'il n'est pas très précis, il n'inclut pas les heures, minutes, secondes, et il ne donne un résultat que "avant (ou le jour même)" et vu que j'ai besoin d'un maximum de précision...

    Mon code est si sale que ça..? (je précise que presque tout les printf sont inutiles, je les ai mis seulement pour mieux voir ce que contenait chaque variable)

    J'ai juste fait un algorithme dans le genre : ouverture du fichier; récupération de la date et heure contenue vers une variable; conversion vers le format date; récupération de la date système; difftime dans une variable; if : difftime retourne un chiffre -nbr de secondes = le jour n'est pas encore passé, else = le jour est dépassé; (à la seconde près)

    Si sale donc ?

    (J'ai aussi deux autres petites questions, est ce qu'on peut récupérer d'internet a la place de celle du système ? et comment je pourrais faire pour convertir la date en char mais au même format que j'utilise (2015-08-30) pour ensuite le stocker dans un nouveau fichier créé (pour la création du fichier c'est pas un problème, juste la conversion vers ce format))

    Merci

  18. #18
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par danieldou Voir le message
    Mon code est si sale que ça..? (je précise que presque tout les printf sont inutiles, je les ai mis seulement pour mieux voir ce que contenait chaque variable)...Si sale donc ?
    Bonjour

    C'est vrai que ton code est assez maladroit. Par exemple date[4] = date[7] = '\0';. Ca te gêne tant que ça ce caractère "-" comme séparateur que tu le remplaces par un autre ? Surtout par un caractère aussi spécial ? Après ça, toute fonction de manipulation de chaine (printf, strcmp, strcpy, strchr, strstr, strtok, etc etc etc) considèrera que la variable "date" ne contient que 4 caractères. Peut-être que ce n'est pas grave au début mais si tu fais évoluer ton code ça peut le devenir. Alors c'est vrai, d'un coté tu y gagnes vu que tes différents atoi() s'arrêtent tous au bon endroit mais t'avais d'autres façons possibles pour y arriver sans corrompre ta chaine d'origine.
    Et pourquoi ouvrir le fichier en "r+" vu que tu n'y écris rien ? Pourquoi mettre inutilement du "else" puisque le "then", s'il se fait, arrête le programme ?
    Et enfin essaye d'aérer ton code ; d'expliquer ce que tu fais, de l'indenter correctement. Ca montrera que tu es conscient de son importance aussi bien de fonctionnement que de relecture.

    Le même code juste un peu réécrit..

    Code c : 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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    int main(int argc, char *argv[])
    {
    	char test[1000];
    	int secondes;
    	FILE* fichier = NULL;
     
    	// Lecture de la date dans le fichier
    	if ((fichier=fopen("test.cert", "r"))== NULL)
    	{
    		printf("Error! opening file");
    		exit(1);
    	}
    	fscanf(fichier,"%[^\n]", test);
    	printf("Data from file:\n%s", test);
    	fclose(fichier);
     
    	// Traitement X
    	test[4] = test[7] = '\0';
    	struct tm tmdate = {0};
    	tmdate.tm_year = atoi(&test[0]) - 1900;
    	tmdate.tm_mon = atoi(&test[5]) - 1;
    	tmdate.tm_mday = atoi(&test[8]);
    	tmdate.tm_hour = atoi(&test[11]) - 1;
    	tmdate.tm_min = atoi(&test[14]);
    	tmdate.tm_sec = atoi(&test[17]);
     
    	// Traitement Y
    	time_t t_c = mktime(&tmdate);
    	time_t t_a = time(NULL);
    	printf("\n\nAffichage de la date certificat\n\n");
    	printf("%s\n", ctime(&t_c));
    	printf("Affichage de la date d\'aujourd\'hui\n\n");
    	printf("%s\n", ctime(&t_a));
     
    	// Calcul de la date
    	secondes = difftime(t_a, mktime(&tmdate));
    	printf("%d\n\n", secondes);
     
    	// Evaluation date expirée
    	if (secondes > 0)
    	{
    		printf("Expir%c", 130);
    	}
    	else
    	{
    		printf("Non expir%c", 130);
    	}
     
    	// Ok, on a fini
    	getch();
    	return 0;
    }

    Tu vois, de suite ça donne immédiatement un sentiment de confiance. On sent que tu sais ce que tu fais et que t'as bien ton algo en tête. Ensuite une autre étape serait de séparer les choses. Le rôle du main() est de commencer le programme, vérifier les paramètres, rien de plus. La lecture du fichier serait dévolue à une fonction spéciale (ce qui permettrait alors, dans le futur, une évolution comme ne plus lire la date depuis un fichier mais depuis un canal de comm par exemple). Le calcul serait dévolu à une autre fonction. Et etc. C'est ça "ne pas être sale"...

    Citation Envoyé par danieldou Voir le message
    (J'ai aussi deux autres petites questions, est ce qu'on peut récupérer d'internet a la place de celle du système ?
    Si tu demande à ton OS de récupérer la date depuis un serveur de temps, alors la date système sera la date du ntp. Sinon tu peux la récupérer toi-même mais c'est alors à toi d'établir la connexion réseau (via socket) et le dialogue selon le protocole ntp...

    Citation Envoyé par danieldou Voir le message
    et comment je pourrais faire pour convertir la date en char mais au même format que j'utilise (2015-08-30) pour ensuite le stocker dans un nouveau fichier créé (pour la création du fichier c'est pas un problème, juste la conversion vers ce format))
    Attention aux termes. "char" c'est un caractère. Tu ne peux donc pas écrire 10 caractères sur un seul (en fait si, tu peux, mais tu ne peux pas les relire ensuite).
    Donc si tu veux écrire une date au format "string" (ou "char*"), te suffit d'user du printf() ou fprintf() si c'est dans un fichier. Ensuite de l'autre coté, t'as des outils pour manipuler les strings...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  19. #19
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 273
    Points : 150
    Points
    150
    Par défaut
    Merci pour ta réponse

    Je pensais pas que le fait de commenter le code ajoute à sa "propreté" ^^ donc selon toi un code propre c'est un code : qui utilise le moins possible de choses pas forcement utiles; commenté; indenté; bien organisé au niveau de la répartition des taches, créer une fonction pour chaque action; c'est bien ça ?

    La lecture du fichier serait dévolue à une fonction spéciale (ce qui permettrait alors, dans le futur, une évolution comme ne plus lire la date depuis un fichier mais depuis un canal de comm par exemple). Le calcul serait dévolu à une autre fonction.
    Pour ce qui est de la fonction de lecture de fichier, j'ai eu un peu de mal justement avec l'évolution de mon code, ça m'a empêché de faire quelques trucs, je m'y prends surement pas comme il faudrait mais j'ai pas encore trouvé de solution...
    Pour ta parenthèse, j'ai pas bien compris, tu pourrais m'expliquer ce que tu entend par canal de comm ? (et puis la lecture dans un fichier est volontaire, le fichier est le plus adapté a ce que j'ai besoin, de toutes façons il contiendra uniquement la date)

    Pour ce qui est du r+, je l'ai mis pour une évolution prévue du code, j'aurais en effet besoin d'écrire dans ce même fichier ^^

    De quel else parle tu ?

    Pour ta solution de l'heure d'internet, une piste, un lien pour m'éclairer ?

    (et pour la conversion du fichier j'ai finalement réussi merci )

    Merci

  20. #20
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par danieldou Voir le message
    Je pensais pas que le fait de commenter le code ajoute à sa "propreté" ^^ donc selon toi un code propre c'est un code : qui utilise le moins possible de choses pas forcement utiles; commenté; indenté; bien organisé au niveau de la répartition des taches, créer une fonction pour chaque action; c'est bien ça ?
    Exactement. Un code propre c'est non seulement un programme qui fonctionne mais aussi un programme agréable à lire (et donc compréhensible facilement) et dans lequel (autant que possible) le futur est déjà pensé.

    Citation Envoyé par danieldou Voir le message
    Pour ta parenthèse, j'ai pas bien compris, tu pourrais m'expliquer ce que tu entend par canal de comm ?
    Il existe plusieurs façons d'envoyer des infos à un programme. Le fichier n'en est qu'une d'entre elles. Tu peux dialoguer aussi avec un programme via une socket (canal de communication réseau), via un pipe (un tube FIFO dans lequel un programme P1 écrit et un programme P2 lit ce qui a été écrit qui est alors automatiquement supprimé), une file de messages (une espèce de "corde à linge" dans lequel un programme P1 "accroche" des infos (qui peuvent être en plus associées à une "étiquette" numérique) et qui sont conservées par l'OS puis, beaucoup plus tard, un programme P2 va décrocher les infos qui y ont été accrochées et pour laquelle l'étiquette correspond à ce qu'il attend) et d'autres encore. Chaque outil a des façons dédiées de lire les infos. Si tu dédies la lecture à une fonction dédiée, tu pourras écrire autant de fonctions que tu vas utiliser d'outils sans que le reste de ton code en souffre...

    Citation Envoyé par danieldou Voir le message
    (et puis la lecture dans un fichier est volontaire, le fichier est le plus adapté a ce que j'ai besoin, de toutes façons il contiendra uniquement la date)
    Oui, aujourd'hui. Mais faut aussi penser à demain...

    Citation Envoyé par danieldou Voir le message
    De quel else parle tu ?
    Dans ton code d'origine, tu écrivais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    si ouverture fichier en erreur, alors
        message
        sortie
    sinon
        lire fichier
        fermer fichier
    fin si
    Moi, j'ai écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    si ouverture fichier en erreur, alors
        message
        sortie
    fin si
    lire fichier
    fermer fichier
    Je gagne une tabulation à gauche (plus d'espace pour coder) et j'évite un "else" finalement inutile...

    Citation Envoyé par danieldou Voir le message
    Pour ta solution de l'heure d'internet, une piste, un lien pour m'éclairer ?
    Te faut apprendre à dialoguer via réseau avec un serveur. Tu peux télécharger mon cours sur les socket. Ensuite connaitre le protocole ntp. C'est un gros truc quand on débute...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. [DATA] Lecture d'une date à partir d'un texte ???
    Par Picsouli dans le forum SAS Base
    Réponses: 8
    Dernier message: 08/06/2012, 15h40
  2. [POI] Lecture d'une cellule de type date
    Par le_misterioso dans le forum Documents
    Réponses: 11
    Dernier message: 31/08/2010, 21h34
  3. Lecture d'une date dans un format étrange
    Par lr dans le forum Général Java
    Réponses: 10
    Dernier message: 24/06/2009, 14h14
  4. Comment mettre une date limite à la lecture d'un PDF ?
    Par Ekimasu dans le forum Autres Logiciels
    Réponses: 13
    Dernier message: 01/08/2008, 15h25
  5. Pb lecture d'une struct date
    Par smag dans le forum C++
    Réponses: 13
    Dernier message: 03/03/2005, 22h17

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