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 :

Tentative de création de carnet d'adresses


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Jiraiya42
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    671
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 671
    Par défaut Tentative de création de carnet d'adresses
    Salut,

    Je tente de faire un carnet d'adresses pour m'exercer mais j'ai un problème car je souhaite créer proposer de créer un fichier texte et ensuite demander le nom, le prénom, le tel, l'adresse... J'essai déjà avec le nom le fichier se crée avec le bon nom mais il me met le nom sous la forme de petits carrés à la place des lettres pi surtout le programme s'arrete jamais...

    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>
     
    int main()
    {
        char nomfich [21] ;
        int menu ;
        char nom ;
        FILE * sortie ;
        printf (" 0- Creation d'un Nouveau Fichier ?\n 1- Modification d'un Fichier existant ?\n") ;
        scanf ("%d", &menu) ;
        switch (menu)
            {
                case 0 : printf ("Nom du fichier a creer ?") ;
                         scanf ("%20s", &nomfich) ;
                         sortie = fopen (nomfich, "w") ;
                         do { printf ("Nom ?") ;
                              scanf ("%20s", &nom) ;
                              if (nom) fwrite (&nom, sizeof(char), 20, sortie) ;
                            }
                         while (nom) ;
                        fclose (sortie) ;
                         break ;
            }
    }
    Il y a sans doute des erreurs mais soyez indulgents svp je suis débutant

  2. #2
    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 Jiraiya42
    Il y a sans doute des erreurs mais soyez indulgents svp je suis débutant
    Je ne sais pas ce que tu entends par indulgent. Ici, on cherche plutôt à être juste et précis. Si ce n'est pas ce que tu cherches, tu t'es trompé de forum...

    Tu devrais commencer par configurer ton compilateur pour qu'il soit plus bavard...

    Avec gcc et -Wall -Wextra -O2, j'obtiens :
    Project : Forums
    Compiler : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c: In function `main':
    main.c:14: warning: char format, different type arg (arg 2)
    main.c:24: warning: control reaches end of non-void function
    Linking console executable: C:\dev\forums\forums.exe
    Process terminated with status 0 (0 minutes, 9 seconds)
    0 errors, 2 warnings
    Ce qui montre déjà 2 bugs à corriger au plus vite.

    Ton indentation echappe de peu au vocable 'horrible'. Elle n'est pas cohérente...

    scanf() mal utilisé (comme ici) est une source d'ennuis. Que se passe-t-il si tu entres 'a' ?

    Le scanf() avec 'nom' est une abomination. Une chaine non vide ne peut entrer dans un char. Comportement indéfini, tout peut arriver...

    Il faut un tableau de char, comme pour le nom de fichier. Pourquoi as-tu changé de façon de procéder ?

    La boucle while a une condition qui ne varie jamais. Boucle infinie...

    Je crois que tu écris du code trop compliqué pour un débutant. Fait une chose à la fois, et quand tu la maitrises, passe à la suivante.

  3. #3
    Membre éclairé Avatar de Jiraiya42
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    671
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 671
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Je ne sais pas ce que tu entends par indulgent. Ici, on cherche plutôt à être juste et précis. Si ce n'est pas ce que tu cherches, tu t'es trompé de forum...

    Tu devrais commencer par configurer ton commpilateur pour qu'il soit plus bavard...

    Avec gcc et -Wall -Wextra -O2, j'obtiens :

    Ce qui montre déjà 2 bugs à corriger au plus vite.

    Ton indentation echappe de peu au vocable 'horrible'. Elle n'est pas cohérente...

    scanf() mal utilisé (comme ici) est une source d'ennuis. Que se passe-t-il si tu entres 'a' ?

    Le scanf() avec 'nom' est une abomination. Une chaine non vide ne peut entrer dans un char. Comportement indéfini, tout peut arriver...

    Il faut un tableau de char, comme pour le nom de fichier. Pourquoi as-tu changé de façon de procéder ?

    La boucle while a une condition qui ne varie jamais. Boucle infinie...

    Je crois que tu écris du code trop compliqué pour un débutant. Fait une chose à la fois, et quand tu la maitrises, passe à la suivante.
    Oui ptet que je me compliques trop et que je vais ptet trop vite en grillant des étapes mais je cherche à me faire la main avec de petits programmes et en fait ça se complique vite...

    Merci pour votre aide

  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 : 48
    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
    Voilà ton code corrigé, compilable (y'a sans doute d'autres moyens de faire):
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
     
    int main (void)
    {
       FILE * sortie = NULL;
       char nomfich [21] = { 0 };
       char nom [21] = { 0 };
       int menu = 0;
       int count = 0;
     
     
       printf (
          " 0- Creation d'un Nouveau Fichier ?\n"
          " 1- Modification d'un Fichier existant ?\n"
       );
       scanf ("%d", & menu);
     
     
       switch (menu)
       {
          case 0:
          {
             printf ("Nom du fichier a creer ?");
             scanf ("%s", nomfich);
     
     
             sortie = fopen (nomfich, "w");
     
             if (sortie != NULL)
             {
                do
                {
                   printf ("Nom ?");
                   count = scanf ("%s", nom);
     
                   if (count == 1)
                   {
                      /* Pour eviter d'avoir les carres dans le fichier texte,
                         on met un caractere de fin de chaine.
                      */
                      nom [21] = '\0';
                      fwrite (& nom, sizeof (char), 20, sortie);
     
     
                      /* On vide l'eventuel reste du tampon. */
                      while (getchar () != '\n');
                   }
                }
                while (count <= 0 || count > 1);
     
                fclose (sortie);
             }
          }
          break;
     
          default:
             break;
       }
     
     
       return EXIT_SUCCESS;
    }
    Déjà tu vois qu'avec ce style d'indentation c'est plus propre et surtout plus lisible, prend l'habitude de bien présenter ton code dès le départ car ton style n'est pas bon du tout !

    Main retourne toujours un int (en C89/90) ! Ici j'ai utilisé EXIT_SUCCESS pour rester le plus portable et c'est d'ailleur plus compréhensible qu'un simple 0

    Quand tu ouvres un fichier, prend bien soin de vérifier que l'ouverture ce soit bien passée sinon t'est bon pour un plantage lors de la tentative d'écriture sur le flux que tu penses être ouvert !

    Prend toujours soin de bien initialiser au moins tes variables et pointeurs à avec une valeur 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 !

  5. #5
    Membre éclairé Avatar de Jiraiya42
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    671
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 671
    Par défaut
    Citation Envoyé par Franck.H
    Voilà ton code corrigé, compilable (y'a sans doute d'autres moyens de faire):
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
     
    int main (void)
    {
       FILE * sortie = NULL;
       char nomfich [21] = { 0 };
       char nom [21] = { 0 };
       int menu = 0;
       int count = 0;
     
     
       printf (
          " 0- Creation d'un Nouveau Fichier ?\n"
          " 1- Modification d'un Fichier existant ?\n"
       );
       scanf ("%d", & menu);
     
     
       switch (menu)
       {
          case 0:
          {
             printf ("Nom du fichier a creer ?");
             scanf ("%s", nomfich);
     
     
             sortie = fopen (nomfich, "w");
     
             if (sortie != NULL)
             {
                do
                {
                   printf ("Nom ?");
                   count = scanf ("%s", nom);
     
                   if (count == 1)
                   {
                      /* Pour eviter d'avoir les carres dans le fichier texte,
                         on met un caractere de fin de chaine.
                      */
                      nom [21] = '\0';
                      fwrite (& nom, sizeof (char), 20, sortie);
     
     
                      /* On vide l'eventuel reste du tampon. */
                      while (getchar () != '\n');
                   }
                }
                while (count <= 0 || count > 1);
     
                fclose (sortie);
             }
          }
          break;
     
          default:
             break;
       }
     
     
       return EXIT_SUCCESS;
    }
    Déjà tu vois qu'avec ce style d'indentation c'est plus propre et surtout plus lisible, prend l'habitude de bien présenter ton code dès le départ car ton style n'est pas bon du tout !

    Main retourne toujours un int (en C89/90) ! Ici j'ai utilisé EXIT_SUCCESS pour rester le plus portable et c'est d'ailleur plus compréhensible qu'un simple 0

    Quand tu ouvres un fichier, prend bien soin de vérifier que l'ouverture ce soit bien passée sinon t'est bon pour un plantage lors de la tentative d'écriture sur le flux que tu penses être ouvert !

    Prend toujours soin de bien initialiser au moins tes variables et pointeurs à avec une valeur par défaut !
    Ah merci pour ta réponse très complète, ça va m'éclairer J'ai une petite question svp, je comprends pas la clause de sortie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while (count <= 0 || count > 1);
    On exécute tant que count est inférieur ou égal à 0 ou bien si count est supérieur à 1. Count reçoit la valeur du nom saisit, donc s'il est saisi il reçoit 1 sinon il reçoit 0 c'est ça ? Donc je comprends pas la clause...

  6. #6
    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 : 48
    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
    scanf retourne le nombre d'élément lus correctement, ici nous n'attendons qu'un seul élément donc si éventuellement le retour et 0 ou inférieur ou supérieur à 1 bin la boucle continue jusqu'à une saisie correcte.

    Normalement, si tu met plus d'une valeur alors que tu n'en attend que une, scanf va lire simplement d'après le nombre de valeur qu'elle attend, d'où la nécessité de vider le tampon au cas où plus d'une valeur est entrée.
    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 !

Discussions similaires

  1. [OL-2010] Création carnets d'adresses dans outlook 2010
    Par BORTA77 dans le forum Outlook
    Réponses: 8
    Dernier message: 13/01/2015, 16h40
  2. [LDAP] Création d'un carnet d'adresse privé pour chaque utilisateur
    Par montaropdf dans le forum Serveurs (Apache, IIS,...)
    Réponses: 1
    Dernier message: 23/03/2011, 13h29
  3. Création d'un carnet d'adresse
    Par rori dans le forum Windows
    Réponses: 2
    Dernier message: 07/11/2006, 09h15
  4. Récupérer le carnet d'adresses de Outlook
    Par pc75 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 01/02/2005, 12h30

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