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 :

[C][Newbie] Besoin d'aide pour un problème tout bête !


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Par défaut [C][Newbie] Besoin d'aide pour un problème tout bête !
    Bonjour a tous !
    J'ai un problème qui me parait bien obscur . . . Je m'explique, voici le 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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    #include <time.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main()
    {
     
     /* int choix = 10; */
      time_t date;
      struct tm *timet;
      char *stringdate;
      char buffer[20];
      char bufferAnniv[4];
      char bufferNom[20];
      int i = 4;
      int c;
      FILE *fp;
     
      while ((c = getchar()) != '\n' && c != EOF); /* mange le tampon */
     
      /* Ouverture du fichier en lecture et écriture */
     
      fp = fopen ("anniversaire.txt", "rw");
     
      printf("DEBUG \n");
     
      if (fp == NULL)
        {
          perror("Fichier inexistant ! \n");
          return EXIT_FAILURE;
        }
     
      printf("DEBUG \n");
     
      stringdate = malloc (sizeof(char) * 10);
     
      if (stringdate == NULL)
        {
          perror("Erreur allocation memoire chaine de caracteres ! \n");
          return EXIT_FAILURE;
        }
     
      timet = malloc(sizeof(struct tm));
     
      if (timet == NULL)
        {
          perror("Erreur allocation memoire structure time ! \n");
          return EXIT_FAILURE;
        }
     
      /* Récupération de la date courante et on la formate comme ceci : jjmm */
     
      time(&date);
     
      timet = gmtime(&date);
     
      strftime (stringdate, 10, "%d%m", timet);
     
     
      printf(" --| Nous sommes le %s", stringdate);
     
      /* Parcours du fichier */
      /* dans bufferAnniv on recopie la date de l'entrée dans le fichier */
      /* dans bufferNom on recopie le nom qui correspond a la date */
      /* Si la date courante correspond a la date de l'entrée dans le fichier on affiche le nom de la personne */
     
      while( fgets( buffer, sizeof(buffer), fp)!=NULL )
        {
         bufferAnniv[0] = buffer[0];
         bufferAnniv[1] = buffer[1];
         bufferAnniv[2] = buffer[2];
         bufferAnniv[3] = buffer[3];
     
         while(buffer[i] != '\n')
           {
    	 bufferNom[i - 4] = buffer[i];
    	 i++;
           }
     
         if (strncmp(bufferAnniv, stringdate, 4) == 0)
           {
     
    	 printf(" --| C'est l'anniversaire de  %s ! \n", bufferNom);
     
           }
       }
     
      return EXIT_SUCCESS;
    }
    Voila, donc je rencontre un problème a l'exécution, il faut que je tape sur une touche du clavier puis sur entrée pour que l'exécution du programme démarre,
    tant que je n'ai pas fait ça, même le 1er printf("DEBUG \n") ne s'affiche pas !
    J'ai essayé de rajouter cette ligne trouvée sur la faq :
    while ((c = getchar()) != '\n' && c != EOF); /* mange le tampon */
    Mais ça n'a rien changé, sauriez d'ou peut venir mon problème ?

    Merci d'avance !!!

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2005
    Messages : 88
    Par défaut
    Eassaye un fflush(stdout), apres le printf

  3. #3
    Membre éclairé Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Par défaut
    Merci pour ta réponse !

    Avec un fflush(stdout) aprés le 1er printf("Debug") ben il faut toujours que j'appuie sur une touche puis sur entrée, mais au lieu de dérouler tout le programme, le programme se bloque au 2e print("Debug") et je dois de nouveau appuyer sur une touche puis sur entrée . . . bizarre non?

  4. #4
    Membre Expert
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Par défaut
    Ton getchar est complètement inutile ici. Lors de l'exécution du getchar(), la machine rencontre un tampon déjà vide, et attend naturellement que quelqu'un vienne y écrire quelque chose.

    Je continue de penser que l'on enseigne trop de conneries en C.

  5. #5
    Membre éclairé Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Par défaut
    Ah ben le getchar je l'ai mis en désespoir de cause !
    Au départ il y était pas, je l'ai mis "par hasard" pour voir si ça solutionnait le problème . . .

  6. #6
    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 frenchi
    Eassaye un fflush(stdout), apres le printf
    Quel rapport avec stdin ? Tu balances des trucs au hasard, comme ça, juste pour voir ?

  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 GyZmoO
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      while ((c = getchar()) != '\n' && c != EOF); /* mange le tampon */
    Totalement inutile au démarrage (mais ça peit servir après une saisie). Il faut cesser de programmer au hasard...

    Je conseille de faire toutes les saisies sur le modèle :

    fgets(...)
    clean(...)

    afin d'avoir du code parfaitement stable.

    Le code de clean() a été publié plusieurs fois récemment.

  8. #8
    Membre éclairé Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Par défaut
    Ma foi je suis d'accord, seulement dans mon programme y'a pas une seule saisie et ça m**** qd même !

  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 GyZmoO
    Ma foi je suis d'accord, seulement dans mon programme y'a pas une seule saisie et ça m**** qd même !
    C'est à dire ?

    Si il n'y a pas de saisie, tu en as encore moins besoin...

    Faut dire que ton code, il est un peu space...

    -> C'est quoi une ouverture de fichier en "rw" ?
    -> Pas de fermeture de fichier
    -> pas de libération de la mémoire... C'est quoi ce pointeur affecté 2 fois de suite ? J'ai peur !

  10. #10
    Membre éclairé Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Par défaut
    Tu le trouves space ?? Pourtant je me suis appliqué
    Non sans rire ben, je lance le prog et rien ne se passe sauf si je tape sur une touche du clavier et que j'appuie sur entrée !!!!! (et normalement le prog n'attend pas de saisie...)

    Ps : le rw ça correspond pas a read et write ???

    Merci.

    [Edit] Un pointeur affecté deux fois de suite ?! Lequel ? je vois pas

  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 GyZmoO
    Non sans rire ben, je lance le prog et rien ne se passe sauf si je tape sur une touche du clavier et que j'appuie sur entrée !!!!! (et normalement le prog n'attend pas de saisie...)
    Evidemment. On se tue à te dire que la boucle avec getchar() ne sert à rien. Qu'est-ce que tu attends pour la virer ?
    Ps : le rw ça correspond pas a read et write ???
    Ben non. Je t'ai demander de cesser de programmer au hasard. Lit la doc ! C'est "r+" ou "w+", mais je ne pense pas que tu ais besoin de ça. C'est difficile à utiliser, surtout sur un fichier texte... Commence par "r", et en cas d'échec, par exemple, tu fermes et tu rouvres en "w" pour pouvoir écrire dedans si ça a un sens... A la fin, tu fermes.

  12. #12
    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 GyZmoO
    [Edit] Un pointeur affecté deux fois de suite ?! Lequel ? je vois pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
          timet = malloc (sizeof (struct tm));
     
          if (timet != NULL)
          {
             <...>
             timet = gmtime (&date);
    J'ai pas compris pourquoi tu utilises une allocation;

Discussions similaires

  1. Besoin d'aide pour un probléme de ICPC
    Par SQL ninjaa dans le forum C
    Réponses: 3
    Dernier message: 18/08/2012, 15h57
  2. Besoin d'aide pour un problème d'exécution
    Par parygo dans le forum MATLAB
    Réponses: 1
    Dernier message: 19/12/2010, 14h10
  3. Aide pour URL rewriting tout bête.
    Par Niki59 dans le forum Apache
    Réponses: 1
    Dernier message: 15/08/2009, 11h49
  4. Réponses: 6
    Dernier message: 26/04/2007, 12h57

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