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

  1. #1
    Membre régulier Avatar de Jiraiya42
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    671
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 671
    Points : 114
    Points
    114
    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 sénior
    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
    Points : 20 985
    Points
    20 985
    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 régulier Avatar de Jiraiya42
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    671
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 671
    Points : 114
    Points
    114
    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 : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    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 !

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 671
    Points : 114
    Points
    114
    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 : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    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.

  7. #7
    Membre régulier Avatar de Jiraiya42
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    671
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 671
    Points : 114
    Points
    114
    Par défaut
    J'essaie d'améliorer mon carnet d'adresse en ajoutant le numéro de téléphone, l'adresse mail et l'adresse postale, mais je suis bloqué au téléphone

    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main (void)
    {
        FILE * sortie = NULL;
        char nomfich [21] = { 0 };
        char nom [21] = { 0 };
        char prenom [21] = { 0 };
        int tel = 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), 12, sortie);
                                            /* On vide l'eventuel reste du tampon. */
                                            while (getchar () != '\n');
                                        }
                                    printf ("Prenom ?");
                                    count = scanf ("%s", prenom);
                                    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 (&prenom, sizeof (char), 12, sortie);
                                            /* On vide l'eventuel reste du tampon. */
                                            while (getchar () != '\n');
                                        }
                                    printf ("Numero de telephone ?");
                                    count = scanf ("%s", tel);
                                    if (count == 1)
                                        {
                                            /* Pour eviter d'avoir les carres dans le fichier texte, on met un caractere de fin de chaine. */
                                            fwrite (tel, sizeof (int), 10, sortie);
                                            /* On vide l'eventuel reste du tampon. */
                                            while (getchar () != '\n');
                                        }
                                }
                            while (count <= 0 || count > 1);
     
                            fclose (sortie);
                        }
                }
     
                break;
                default:
                break;
        }
     
        return EXIT_SUCCESS;
    }
    Et le soucis, c'est que j'ai rapport d'erreur Windows lorsque je valide le numéro de tel, j'ai vérifié les définitions de variables et ça me parait correct non ? Autre chose, je sais pas si le fait de répéter ma boucle if est obligatoire ou pas, une idée svp ?

  8. #8
    Expert éminent sénior
    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
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Jiraiya42
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        int tel = 0 ;
                                    printf ("Numero de telephone ?");
                                    count = scanf ("%s", tel);
    Et le soucis, c'est que j'ai rapport d'erreur Windows lorsque je valide le numéro de tel, j'ai vérifié les définitions de variables et ça me parait correct non ?
    Pour saisir un int au format décimal avec scanf(), c'est "%d" et non "%s"... scanf() est une fonction difficile à maitriser et à utiliser correctement (débutant ou non). Je conseille fgets() + strtol(), par exemple...

    Nota. Un 'numéro de téléphone' n'est pas un nombre. C'est une donnée textuelle comme un nom ou une adresse... Une chaine de caractère serait donc plus appropriée...

    Je te conseille fortement d'écrire tes propres fonctions de saisie. Trop de répétitions dans le code...

    http://emmanuel-delahaye.developpez.com/inputs.htm

  9. #9
    Membre régulier Avatar de Jiraiya42
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    671
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 671
    Points : 114
    Points
    114
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Pour saisir un int au format décimal avec scanf(), c'est "%d" et non "%s"... scanf() est une fonction difficile à maitriser et à utiliser correctement (débutant ou non). Je conseille fgets() + strtol(), par exemple...

    Nota. Un 'numéro de téléphone' n'est pas un nombre. C'est une donnée textuelle comme un nom ou une adresse... Une chaine de caractère serait donc plus appropriée...

    Je te conseille fortement d'écrire tes propres fonctions de saisie. Trop de répétitions dans le code...

    http://emmanuel-delahaye.developpez.com/inputs.htm
    Ca marche pas + avec %d mais je vais suivre ton conseil et passer à fgets()

  10. #10
    Membre régulier Avatar de Jiraiya42
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    671
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 671
    Points : 114
    Points
    114
    Par défaut
    Je comprends pas l'utilisation de fgets(), comment utilise-t-on la chaine de caractère récupérée ? Plus besoin de scanf ? Quelqu'un peut me donner un piti exemple de traitement svp ?

  11. #11
    Expert éminent sénior
    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
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Jiraiya42
    Je comprends pas l'utilisation de fgets(), comment utilise-t-on la chaine de caractère récupérée ? Plus besoin de scanf ? Quelqu'un peut me donner un piti exemple de traitement svp ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       char s[123];
       fgets (s, sizeof s, stdin);
       printf ("'%s'\n", s);

  12. #12
    Membre régulier Avatar de Jiraiya42
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    671
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 671
    Points : 114
    Points
    114
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       char s[123];
       fgets (s, sizeof s, stdin);
       printf ("'%s'\n", s);
    Ah oki... effectivement ça à l'air mieux que scanf... Merci bien là j'essai de me faire une fonction pour que ça écrive dans le fichier pour éviter les répétitions je rame mais bon faut que je m'habitue à manipuler les fonctions

  13. #13
    Expert éminent sénior
    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
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Jiraiya42
    Ah oki... effectivement ça à l'air mieux que scanf... Merci bien là j'essai de me faire une fonction pour que ça écrive dans le fichier pour éviter les répétitions je rame mais bon faut que je m'habitue à manipuler les fonctions
    Attention, comme tu as pu le constater, fgets() prend le '\n' (du moins quand il y a la place). Il y a donc un peu de nettoyage à 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
     
    /* recherche du '\n' */
    char *p = strchr (s, '\n');
     
    /* si on l'a trouve, destruction */
    if (p != NULL)
    {
       *p = 0;
    }
    /* sinon, purge des caracteres non lus */
    else
    {
       int c;
       while ((c = getchar()) != '\n" && c != EOF)
       {
       }
    }
    Evidemment, on n'écrit pas ça à chaque saisie. Les fonctions sont faites pour économiser le code...

  14. #14
    Membre régulier Avatar de Jiraiya42
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    671
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 671
    Points : 114
    Points
    114
    Par défaut
    J'essaie toujours de faire ma fonction et j'ai quelques problèmes, j'ai étudié le chapître des fonctions de mon livre et j'ai donc fais ça:

    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
     
    if (sortie != NULL)
                        {
                            do
                                {
                                    printf ("Nom ?");
                                    count = scanf ("%s", &enreg);
                                    exe = fecriture (&enreg) ;
                                    printf ("Prenom ?");
                                    count = scanf ("%s", &enreg);
                                    exe = fecriture (enreg) ;
                                    printf ("Numero de telephone ?");
                                    count = scanf ("%s", &enreg);
                                    exe = fecriture (enreg) ;
                                }
                            while (count <= 0 || count > 1);
     
                            fclose (sortie);
                        }
    Donc mon main et là ma fonction

    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int fecriture (char enreg [16])
    {
        if (count == 1)
            {
                /* Pour eviter d'avoir les carres dans le fichier texte, on met un caractere de fin de chaine. */
                enreg [16] = '\0';
                fwrite (&enreg, sizeof (char), 16, sortie);
                /* On vide l'eventuel reste du tampon. */
                while (getchar () != '\n');
            }
        return 0;
    }
    Et mon compilateur me dit ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Project   : Console application
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\Program Files\CodeBlocks\Projets\Carnet d'Adresse\
    --------------------------------------------------------------------------------
    Switching to target: default
    Linking console executable: C:\Program Files\CodeBlocks\Projets\Carnet d'Adresse\console.exe
    .objs\main.o:main.c:(.text+0xfe): undefined reference to `fecriture'
    .objs\main.o:main.c:(.text+0x131): undefined reference to `fecriture'
    .objs\main.o:main.c:(.text+0x164): undefined reference to `fecriture'
    collect2: ld returned 1 exit status
    Process terminated with status 1 (0 minutes, 1 seconds)
    fecriture je l'ai définis donc je comprends pas trop, quelqu'un peut m'aider svp ?

    Merci d'avance

    PS: J'ai pas encore changer avec fgets, chaque chose en sont temps

  15. #15
    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 : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Ta fonction, tu l'as définie dans le même fichier que ton main ou dans un module séparé ? Si tu l'as définie dans ton main.c, c'est une fonction dite static donc, tu peux te passer de sa déclaration mais dans ce cas précis, elle doit donc se trouver avant ta fonction main !

    Sinon montre tout ton code pour qu'on puisse t'aider mieux !

  16. #16
    Membre régulier Avatar de Jiraiya42
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    671
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 671
    Points : 114
    Points
    114
    Par défaut
    J'ai un fichier main où j'ai déclaré ma fonction et un fichier fecriture contenant la fonction, je mets tout le code

    main

    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main (void)
    {
        FILE * sortie = NULL;
        int fecriture (int) ;
        char nomfich [21] = { 0 };
        char enreg [16] = { 0 };
        int exe = 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", &enreg);
                                    exe = fecriture (&enreg) ;
                                    printf ("Prenom ?");
                                    count = scanf ("%s", &enreg);
                                    exe = fecriture (enreg) ;
                                    printf ("Numero de telephone ?");
                                    count = scanf ("%s", &enreg);
                                    exe = fecriture (enreg) ;
                                }
                            while (count <= 0 || count > 1);
     
                            fclose (sortie);
                        }
                }
     
                break;
                default:
                break;
        }
     
        return EXIT_SUCCESS;
    }
    fecriture

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int fecriture (char enreg [16])
    {
        if (count == 1)
            {
                /* Pour eviter d'avoir les carres dans le fichier texte, on met un caractere de fin de chaine. */
                enreg [16] = '\0';
                fwrite (&enreg, sizeof (char), 16, sortie);
                /* On vide l'eventuel reste du tampon. */
                while (getchar () != '\n');
            }
        return 0;
    }

  17. #17
    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 : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Bon bin dans ce cas c'est normal, là tu touches directement à la programmation modulaire il faut donc respecter certaines règles ! En fait, il faut que tu créé un fichier fecriture.h avec ceci dedans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #ifndef FECRITURE_H
    #define FECRITURE_H
     
    int fecriture (char enreg [16]);
     
    #endif
    Tu dois aussi dans ce cas ajouter la directive d'inclusion dans ton fichier main.c et fecriture.c

    Voici un petit cours fort sympatique qui peut t'en apprendre un peu plus sur la programmation modulaire: Cours et tutoriels pour apprendre C

  18. #18
    Membre régulier Avatar de Jiraiya42
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    671
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 671
    Points : 114
    Points
    114
    Par défaut
    Citation Envoyé par Franck.H
    Bon bin dans ce cas c'est normal, là tu touches directement à la compilation séparée ! En fait, il faut que tu créé un fichier fecriture.h avec ceci dedans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #ifndef FECRITURE_H
    #define FECRITURE_H
     
    int fecriture (char enreg [16]);
     
    #endif
    Tu dois aussi dans ce cas ajouter la directive d'inclusion dans ton fichier main.c et fecriture.c
    Ah oki merci, petite question, quelle est la méthode la plus pratique ? Celle-ci ou intégrer la fonction dans le main stp ? Et avec ta solution faut-il que je modifie l'appel de ma fonction ou faut il que je le laisse tel quel stp ?

  19. #19
    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 : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par Jiraiya42
    Ah oki merci, petite question, quelle est la méthode la plus pratique ?
    Si c'est pour un petit code comme le tiens, un simple petit programme d'entraînement, je mettrais tout dans le main.c histoire de faire au plus simple. Une fois que tu te sent plus à l'aise avec le C tu peux commencer à voir la programmation modulaire, concept qui est étudié bien après les bases du langage en générale !

    Citation Envoyé par Jiraiya42
    Et avec ta solution faut-il que je modifie l'appel de ma fonction ou faut il que je le laisse tel quel stp ?
    Rien à changer !

  20. #20
    Expert éminent sénior
    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
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Jiraiya42
    J'ai un fichier main où j'ai déclaré ma fonction et un fichier fecriture contenant la fonction, je mets tout le code
    Alors il manque un ficher d'interface, par exemple "fecriture.h", qui doit contenir le prototype de la fonction et un protection contre les inclusions multiples :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #ifndef H_FECRITURE
    #define H_FECRITURE
     
    int fecriture (char enreg []);
     
    #endif
    J'ai enlevé le 16, car il est inutile et pourrait induire en erreur.
    Ce fichier doit être inclus dans le fichier de définition (ici, par exemple fecriture.c) et dans tous les fichiers qui utilisent cette fonction (ici, main.c)

    Détails ici : http://emmanuel-delahaye.developpez.com/codage.htm

    Nota : Si tu ne maitrises bien pas les fonctions, tu devrais commencer par définir celles-ci dans ton main.c (avant main()). Il est préférable d'acquerir un concept à la fois. La compilation séparé, ça vient après...

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, 17h40
  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, 14h29
  3. Création d'un carnet d'adresse
    Par rori dans le forum Windows
    Réponses: 2
    Dernier message: 07/11/2006, 10h15
  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, 13h30

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