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 :

Annuaire téléphonique V2


Sujet :

C

  1. #21
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 70
    Points : 38
    Points
    38
    Par défaut
    Désolé, c'est une faute de frappe le "r+f" c'est juste "r".

    Pour ce qui est du &, mon compilateur ne me fait de remarque
    et ça marche peut importe si je fais avec & ou pas.
    (après test avec un printf).

    Je rajoute de suite le return dans la fonction recherche() !

    Et pour l'ouverture du fichier je suis sur que ça marche
    j'ai déjà fait des tests en écrivant des noms dans le fichier.

  2. #22
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Je viens de tester le programme.

    Premièrement, il y a pas mal de warnings avec -Wall et -Wextra, ce serait bien de les faire disparaître.

    Deuxièmement, j'ai souhaité ajouter une entrée. Je rentre le nom et le numéro et puis plus rien.... (Ah ! J'ai fini par remarquer que le menu n'était "simplement" pas réaffiché mais que le programme est bien en attente d'une commande).

    En regardant le code, je vois des scanf() : pas terrible. scanf() est peu adapté à la saisie de l'utilisateur. Beaucoup de gens préfèrent faire fgets() et utiliser sscanf() sur le résultat pour extraire des données. Pour lire uniquement une chaine, c'est fgets() qu'il faut utiliser (et jamais gets() !).

    Ligne 49 :
    scanf("%c",&choix);
    Ca laisse '\n' dans le buffer clavier et c'est pas bon si derrière on utilise des fonctions sensibles à ce caractère comme fgets()... Il existe getchar() aussi pour récupérer un seul caractère (avec le même problème d''\n' néanmoins).

    Voir à tout hasard : http://c.developpez.com/faq/?page=cl...buffer_clavier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct {
        unsigned char nom[NOM+1];//prise en compte du '\0' en fin de tableau
        unsigned char num[NUM+1];
    }Personne;
    Pourquoi mettre unsigned? Si veut des caractères ASCII, mieux vaut mettre char (EDIT : je vois que ça a déjà été signalé ^^).

    Ligne 161 :
    Le compilateur n'est pas d'accord !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    D:\...\main.c|161|warning: format '%s' expects argument of type 'char *', but argument 2 has type 'char (*)[32]' [-Wformat]|
    (EDIT : ça a déjà été signalé aussi ^^).

    Je rajoute ceci après l'ouverture du fichier comme conseillé par les autres posteurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        if(fichier == NULL)
            exit(EXIT_FAILURE);
    Et mon programme s'arrête... Je me demande du coup ce que le code faisait depuis tout à l'heure...

    Les noms de variables sont globalement peu judicieux. Le meilleur exemple est celui là :
    C'est la seule variable de type Carnet de la fonction, pourquoi lui mettre un numéro ? Pourquoi ne pas lui mettre un vrai non tel que carnet ?

    AfficheC() (pourquoi ne pas mettre Carnet mais juste C ?) ne revient pas au début du fichier.

    Ne mixe pas le français et l'anglais dans ton code. Si tout est en français, je sais que les fonctions sont supprimer() et ajouter() ; tout en anglais, delete() et add(). Mais si tu mixes, c'est pas simple de ce souvenir si c'est add() et supprimer(), ajouter() et delete(), add() et delete() ou encore ajouter et supprimer.

    C'est tout. Pour le moment.


    EDIT :
    Pour ce qui est du &, mon compilateur ne me fait de remarque
    et ça marche peut importe si je fais avec & ou pas.
    Douce illusion

    J'ai déjà eu ce genre de mésaventure : http://www.developpez.net/forums/d12...c/cast-en-int/ suivi de http://gradot.wordpress.com/2012/08/...ointeurs-en-c/

    Ce genre de message est presque une erreur. Passer un entier là ou un pointeur est attendu, c'est la segmentation fault au coin de la rue. Des fois, on a de la chance mais ça veut dire qu'on ne comprend pas ce qu'on fait et la fois suivante, la punition sera là.

  3. #23
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 192
    Points : 678
    Points
    678
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char pers[32];
        int i=0,cpt=0,comp=0;
     
        printf("Saisir le nom de la personne recherchee:\n");
        scanf("%s",&pers);
    Quand tu écris ceci "pers" est un pointeur vers la première "case" de ton tableau (le premier char du tableau)
    Si tu écris tu ne demandes donc pas à l'utilisateur d'écrire dans ton tableau mais dans le pointeur qui pointe sur ton tableau -> PLANTAGE

    EDIT (suite au message de Bktero):
    Autant pour moi je ne m'étais jamais trouvé dans une situation où ce "détail" n'avait pas d'importance =p (ou alors je ne m'en était jamais rendu compte). Je n'ai actuellement pas accès à un compilateur mais je testerai le code que tu propose dès que j'en aurai l'occasion.

  4. #24
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    tu ne demandes donc pas à l'utilisateur d'écrire dans ton tableau mais dans le pointeur qui pointe sur ton tableau -> PLANTAGE
    Oui mais non. C'est ce que tu pourras lire dans mes lien en bas de mon message précédent.

    Un petit code pour s'en convaincre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void f(char *p)
    {
    	printf("Adresse = %p\n", p);
    }
     
    int main(void)
    {
        char tab[32];
        f(tab);
        f(&tab); // warning !
        return 0;
    }
    Un seul warning à la compilation :
    warning: passing argument 1 of ‘f’ from incompatible pointer type
    Et le résultat de l'exécution :
    Adresse = 0x7fff6c866b00
    Adresse = 0x7fff6c866b00
    En effet, tab est converti lors de l'appel en &tab[0], cad l'adresse* du premier élément du tableau. Or, &tab est l'adresse du tableau lui-même et comme le tableau commence toujours par son premier élément, il s'avère que les deux adresses sont égales. Cela ne devrait donc pas planter dans ce cas. D'où mon "douce illusion".

    *: j'utilise bien le terme d'adresse et non de pointeur. C'est une subtile nuance qui dans un cas comme celui-ci mérite d'être faite.

  5. #25
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 70
    Points : 38
    Points
    38
    Par défaut
    Je ne sais pas comment voir les warnings, j'ai code blocks et lorsque je compile il ne m'affiche rien.
    Et je vais change ce que tu m'as dit avec les fgets et sscanf.

    J'ai enlevé les unsigned.

    Pour ce qui est des noms de variables, c'est un peu anarchique
    parce que j'étais en train d'apprendre les structures en C et je m'inspirai de ce que j'avais appris avec JAVA.

    Et enfin, personne n'a d'idée de pourquoi je n'arrive pas à lire mon fichier ?

    NB: si je ne ré affiche pas le menu c'est à cause du fait que ça me le ré affiche deux fois après (exemple code source en dessous)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void AfficheC(Carnet *cLecture,FILE* fichier) //Affiche le carnet
    {
        unsigned char i=0;
     
         while (fgets(cLecture->t_personne[i].nom, cLecture->n, fichier) != NULL)
            {
                printf("%s", cLecture->t_personne[i].nom); // On affiche la chaîne qu'on vient de lire
                i++;
            }
    }
    code source:
    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
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define NOM 32
    #define NUM 16
     
    /***Structure***/
    typedef struct {
        char nom[NOM+1];//prise en compte du '\0' en fin de tableau
        char num[NUM+1];
    }Personne;
     
    typedef struct{
        Personne t_personne[20];
        int n;//compteur indique le nombre de persone dans le tableau
    }Carnet;
     
    /*****Prototype***/
    void Initialiser(Personne *pIn,Carnet *cIn);
    void creerP(Personne *p2,FILE* fichier);
    void AfficheP(Personne *pAf);
    void AddP(Personne *pAj,Carnet *cAj,FILE* fichier);
    void AfficheC(Carnet *cLecture,FILE* fichier);
    void Del(Carnet *cDel);
    int Recherche(Carnet *cRech);
     
    /**Principale***/
    int main(int argc,char *argv[])
    {
        Personne p1;
        Carnet c1;
        char choix;
        FILE* fichier=NULL;
     
        fichier=fopen("annuaire.txt","r+");
        if(fichier==NULL)
        exit(EXIT_FAILURE);
    //r+ ->Lecture/écriture
     
        Initialiser(&p1,&c1);
    for(;;)
        {
        printf("[A] : Ajouter une personne au Carnet\n");
        printf("[D] : Supprimer une personne au Carnet\n");
        printf("[V] : Affichage du carnet\n");
        printf("[S] : Recherche d une personne dans le Carnet\n");
        printf("[Q] : Quitter\n");
     
     
           scanf("%c",&choix);
     
            switch(choix)
            {
                case 'A':
                AddP(&p1,&c1,fichier);
                break;
     
                case 'D':
                Del(&c1);
                break;
     
                case 'V':
                AfficheC(&c1,fichier);
                break;
     
                case 'S':
                Recherche(&c1);
                break;
     
                case 'Q':
                fclose(fichier);
                return 0;
                break;
     
            }
        }
    }
    /***Fonction***/
    void Initialiser(Personne *pIn,Carnet *cIn)//Mise à 0
    {
        unsigned char i,a,b;//type unsigned-> rien <0 donc 2^8=de 0 à 256
        //Initialisation de Personne
        for(i=0;i<NOM;i++)
        {
        pIn->nom[i]=0;
        }
        for(i=0;i<NUM;i++)
        {
        pIn->num[i]=0;
        }
        //Initialisation du Carnet
        for(i=0;i<20;i++)
        {
            for(a=0;a<NOM;a++){
            cIn->t_personne[i].nom[a]=0;
            }
            for(b=0;b<16;b++){
            cIn->t_personne[i].num[b]=0;
            }
        }
        cIn->n=0;
    }
     
    void creerP(Personne *pCr,FILE* fichier)//Créer une seule personne
    {
        printf("saisir le nom de cette personne:\n");
        scanf("%s",pCr->nom);//pCr->nom <=> (*pCr).nom
        printf("saisir le numero de cette personne:\n");
        scanf("%s",pCr->num);
        fprintf(fichier,"%s %s \n",pCr->nom,pCr->num);
    }
     
    void AfficheP(Personne *pAf)//Affiche une seule personne
    {
        printf("La personne s'appelle:\n %s \n",pAf->nom);
        printf("Numero:\n %s \n",pAf->num);
    }
     
    void AddP(Personne *pAj,Carnet *cAj,FILE* fichier)//Créer une personne et l'ajoute au carnet
    {
        creerP(pAj,fichier);
        cAj->t_personne[cAj->n]= *pAj;//On stocke dans Personne de Carnet le premier personnage
        cAj->n=(cAj->n)+1;//On incrémente de 1 la constante n
    }
     
    void AfficheC(Carnet *cLecture,FILE* fichier) //Affiche le carnet
    {
        unsigned char i=0;
     
         while (fgets(cLecture->t_personne[i].nom, cLecture->n, fichier) != NULL)
            {
                printf("%s", cLecture->t_personne[i].nom); // On affiche la chaîne qu'on vient de lire
                i++;
            }
    }
     
    void Del(Carnet *cDel)
    {
        unsigned char i;
        int suppr;
     
        printf("Quelle ligne du carnet voulez vous supprimer ?\n");
        scanf("%d",&suppr);
     
        for(i=0;i<32;i++){
        cDel->t_personne[suppr].nom[i]=0;
        }
        for(i=0;i<16;i++){
        cDel->t_personne[suppr].num[i]=0;
        }
    }
    int Recherche(Carnet *cRech)
    //Comparaison de deux tableaux et affichage de la ligne du
    //tableau t_personne correspondant à pers[i]
    {
        char pers[32];
        int i=0,cpt=0,comp=0;
     
        printf("Saisir le nom de la personne recherchee:\n");
        scanf("%s",pers);
     
        while(cpt<cRech->n)
        {
            comp=strcmp(pers,cRech->t_personne[cpt].nom);
            //strcmp renvoie 0 si les deux chaines de
            //caractère sont égales
            if(comp==0)
            {
                printf("le nom est a la ligne %d\n",cpt);
                return 1;
            }
            else
            {
                cpt++;
    //On passe à la ligne suivante du tableaux si le nom
    //ne correspond pas
            }
        }
    }

  6. #26
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    As-tu résolu ton problème ?

  7. #27
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 70
    Points : 38
    Points
    38
    Par défaut
    Je n'ai pas réussi à résoudre les deux problèmes i.e.
    lecture du fichier et affichage du menu sans répétition

  8. #28
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Au lieu de faire un bête exit(), rajouter aussi un appel à perror() pour connaitre la cause.

    Le fichier annuaire.txt existe t-il ? Je présume que non et comme (de mémoire), l'option "r+" ne crée pas le fichier s'il n'existe pas, ça doit échouer.

    De plus, en comparant des 2 dernières versions du code, tu n'as pas tenu compte des remarques sur la façon de récupérer la commande de l'utilisateur... Ni même de la plupart de mes autres remarques...

  9. #29
    Membre confirmé
    Avatar de deletme
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 257
    Points : 519
    Points
    519
    Par défaut
    Salut,

    J'ai repris ton code et en faisant quelques modifications j'arrive à afficher les nom et numéros des personnes stockées dans le fichier.

    Tes erreurs sont :

    Tu dois fermer le fichier après avoir écrit dedans pour forcer l'écriture des données :
    The fclose() function flushes the stream pointed to by fp (writing any buffered output data
    utilisation de la fonction fgets.
    Le premier paramètre peut être trop petit pour contenir à la fois le nom et le numéro.
    Le deuxième paramètre appelé n dans le prototype indique :
    n -- This is the maximum number of characters to be read (including the final null-character). Usually, the length of the array passed as str is used.
    Et voici la façon dont tu l'utilises :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while (fgets(cLecture->t_personne[i].nom, cLecture->n, fichier) != NULL)
            {
                printf("%s", cLecture->t_personne[i].nom); // On affiche la chaîne qu'on vient de lire
                i++;
            }
    Lorsque que tu n'as enregistré qu'un seul contact, nom, cLecture->n vaut 1 et c'est là que se pose un petit problème. Tu indiques dans qu'il doit lire au maximum 1 caractère du fichier dont le caractère fin chaine avant de rencontrer une nouvelle ligne ou un EOF. Et c'est d'ailleurs ce qu'il fait mais ne te retourne que le caractère de fin de ligne. Essayes après avoir fait deux enregistrement, ça passe.

    Pour éviter ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char tab[255]; // a remplacer, c'est pour l'exemple
    while (fgets(tab, NOM + NUM + 1, fichier) != NULL)
        {
            printf("%s", tab); // On affiche la chaîne qu'on vient de lire
        }
    Avec ceci, tu lui indique qu'il doit lire par ligne un maximum de caractère qui correspond à ton nom le plus long et au numéro de téléphone (il faut également compter le caractère d'espacement.
    Je te laisse réfléchir pour faire de façon plus propre (une macro du type MAXCHAR serait plus parlante).


    Pour ce qui est de l'affichage double du menu, c'est un cas très fréquent lorsqu'on utilise scanf. Pour palier ceci, insère un fflush(sdtin) après chaque scanf.

    J'ai également passé le fichier en variable globale. En premier lieu je teste sa présence et le créé le cas échant.

    Code corrigé et fonctionnel (du moins pour la partie ajout et affichage du carnet) Pour le reste je te laisse intégrer les corrections en suivant les conseils de Bktero :
    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
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define NOM 32
    #define NUM 16
     
    /***Structure***/
    typedef struct {
        char nom[NOM+1];//prise en compte du '\0' en fin de tableau
        char num[NUM+1];
    }Personne;
     
    typedef struct{
        Personne t_personne[20];
        int n;//compteur indique le nombre de persone dans le tableau
    }Carnet;
     
    /*****Prototype***/
    void Initialiser(Personne *pIn,Carnet *cIn);
    void creerP(Personne *p2);
    void AfficheP(Personne *pAf);
    void AddP(Personne *pAj,Carnet *cAj);
    void AfficheC(Carnet *cLecture);
    void Del(Carnet *cDel);
    int Recherche(Carnet *cRech);
     
    FILE* fichier=NULL;
     
    /**Principale***/
    int main(void)
    {
        Personne p1;
        Carnet c1;
        char choix;
     
     
        fichier=fopen("annuaire.txt","a");
        if(fichier==NULL)
        {
            printf("Impossible de lire ou de créer un annuaire\n");
            exit(EXIT_FAILURE);
        }
     
        fclose(fichier);
    //r+ ->Lecture/écriture
     
        Initialiser(&p1,&c1);
    for(;;)
        {
        printf("[A] : Ajouter une personne au Carnet\n");
        printf("[D] : Supprimer une personne au Carnet\n");
        printf("[V] : Affichage du carnet\n");
        printf("[S] : Recherche d une personne dans le Carnet\n");
        printf("[Q] : Quitter\n");
     
     
        choix = getchar();
            switch(choix)
            {
                case 'A':
                AddP(&p1,&c1);
                break;
     
                case 'D':
                Del(&c1);
                break;
     
                case 'V':
                AfficheC(&c1);
                break;
     
                case 'S':
                Recherche(&c1);
                break;
     
                case 'Q':
                return 0;
                break;
     
            }
        }
    }
    /***Fonction***/
    void Initialiser(Personne *pIn,Carnet *cIn)//Mise à 0
    {
        unsigned char i,a;//type unsigned-> rien <0 donc 2^8=de 0 à 256
        //Initialisation de Personne
        for(i=0;i<NOM;i++)
        {
        pIn->nom[i]=0;
        }
        for(i=0;i<NUM;i++)
        {
        pIn->num[i]=0;
        }
        //Initialisation du Carnet
        for(i=0;i<20;i++)
        {
            for(a=0;a<NOM;a++){
            cIn->t_personne[i].nom[a]=0;
            cIn->t_personne[i].num[a]=0;
            }
        }
        cIn->n=0;
    }
     
    void creerP(Personne *pCr)//Créer une seule personne
    {
        printf("saisir le nom de cette personne:\n");
        scanf("%s",pCr->nom);//pCr->nom <=> (*pCr).nom
        fflush(stdin);
        printf("saisir le numero de cette personne:\n");
        scanf("%s",pCr->num);
        fflush(stdin);
     
        fichier=fopen("annuaire.txt","a"); // append
        fprintf(fichier,"%s %s \n",pCr->nom,pCr->num);
        fclose(fichier);
    }
     
    void AfficheP(Personne *pAf)//Affiche une seule personne
    {
        printf("La personne s'appelle:\n %s \n",pAf->nom);
        printf("Numero:\n %s \n",pAf->num);
    }
     
    void AddP(Personne *pAj,Carnet *cAj)//Créer une personne et l'ajoute au carnet
    {
        creerP(pAj);
        cAj->t_personne[cAj->n]= *pAj;//On stocke dans Personne de Carnet le premier personnage
        cAj->n=(cAj->n)+1;//On incrémente de 1 la constante n
    }
     
    void AfficheC(Carnet *cLecture) //Affiche le carnet
    {
        unsigned char i=0;
        char tab[255];
     
        fichier = fopen("annuaire.txt", "r");
        while (fgets(tab, 255, fichier) != NULL)
        {
            printf("%s", tab); // On affiche la chaîne qu'on vient de lire
            i++;
        }
        fclose(fichier);
        fflush(stdin);
    }
     
    void Del(Carnet *cDel)
    {
        unsigned char i;
        int suppr;
     
        printf("Quelle ligne du carnet voulez vous supprimer ?\n");
        scanf("%d",&suppr);
     
        for(i=0;i<32;i++){
        cDel->t_personne[suppr].nom[i]=0;
        }
        for(i=0;i<16;i++){
        cDel->t_personne[suppr].num[i]=0;
        }
    }
    int Recherche(Carnet *cRech)
    //Comparaison de deux tableaux et affichage de la ligne du
    //tableau t_personne correspondant à pers[i]
    {
        char pers[32];
        int i=0,cpt=0,comp=0;
     
        printf("Saisir le nom de la personne recherchee:\n");
        scanf("%s",pers);
     
        while(cpt<cRech->n)
        {
            comp=strcmp(pers,cRech->t_personne[cpt].nom);
            //strcmp renvoie 0 si les deux chaines de
            //caractère sont égales
            if(comp==0)
            {
                printf("le nom est a la ligne %d\n",cpt);
                return 1;
            }
            else
            {
                cpt++;
    //On passe à la ligne suivante du tableaux si le nom
    //ne correspond pas
            }
        }
    }
    Dans l'attente de ton retour, bon courage
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    - Martin Golding
    Traduction obligatoire : "Toujours écrire du code en gardant en tête que le mec qui en assurera la maintenance est un psychopathe violent qui connait votre adresse"

  10. #30
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 70
    Points : 38
    Points
    38
    Par défaut
    Pour ce qui est des noms de fonctions, si j'ai choisit ces noms c'est uniquement
    car je suis l’énoncé de ce site:
    http://www.telechargercours.com/prog...es-structures/

    Et oui le fichier annuaire.txt existe, j'arrive sans problème à écrire dedans

    Enfin pour ce qui est de la récupération des données, j'essaye de comprendre

Discussions similaires

  1. Annuaire téléphonique Client server
    Par souminet dans le forum Bases de données
    Réponses: 4
    Dernier message: 12/05/2008, 14h22
  2. Création d'un annuaire téléphonique
    Par Delnir dans le forum Débuter
    Réponses: 2
    Dernier message: 17/02/2008, 13h29
  3. API annuaire téléphonique
    Par Alex06 dans le forum 4D
    Réponses: 2
    Dernier message: 31/05/2007, 15h41
  4. construire un annuaire téléphonique
    Par batalich dans le forum C
    Réponses: 7
    Dernier message: 13/03/2007, 23h41
  5. [MCD] Modéliser un annuaire téléphonique
    Par allowen dans le forum Schéma
    Réponses: 9
    Dernier message: 20/10/2005, 10h23

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