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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    Par défaut Annuaire téléphonique V2
    Bonjour,

    Après avoir fini l'annuaire avec les structures j'attaque avec les fichiers
    et la j'ai quelques problèmes...
    J'arrive sans problème à écrire mais dés que je veux lire tout mon carnet ,aucun bug n'apparaît mais rien ne s'affiche sur le terminal ...

    Je vous remercie d'avance!
    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
     
    void AfficheC(Carnet *cLecture,FILE* fichier) //Affiche le carnet
    {
        unsigned char i;
     
    //    for(i=0;i<cLecture->n;i++)
    //    {
    //    printf("%s a pour numero %s \n",cLecture->t_personne[i].nom,cLecture->t_personne[i].num);
    //    //Affiche le nom et numéro de chacun des éléments du tableaux Personne[20]
    //    }
         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
            }
    }
    code complet (en transformation):
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define NOM 32
    #define NUM 16
     
    /***Structure***/
    typedef struct {
        unsigned char nom[NOM+1];//prise en compte du '\0' en fin de tableau
        unsigned 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+f");
    //r+ ->Lecture/écriture
     
        Initialiser(&p1,&c1);
     
        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");
     
        for(;;)
        {
           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<32;i++)
        {
        pIn->nom[i]=0;
        }
        for(i=0;i<16;i++)
        {
        pIn->num[i]=0;
        }
        //Initialisation du Carnet
        for(i=0;i<20;i++)
        {
            for(a=0;a<32;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;
     
    //    for(i=0;i<cLecture->n;i++)
    //    {
    //    printf("%s a pour numero %s \n",cLecture->t_personne[i].nom,cLecture->t_personne[i].num);
    //    //Affiche le nom et numéro de chacun des éléments du tableaux Personne[20]
    //    }
         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
            }
    }
     
    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
            }
        }
    }

  2. #2
    Membre chevronné
    Homme Profil pro
    Cadre informatique
    Inscrit en
    Avril 2013
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Cadre informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 183
    Par défaut
    Citation Envoyé par bouritosse Voir le message
    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
     
    void AfficheC(Carnet *cLecture,FILE* fichier) //Affiche le carnet
    {
        unsigned char i;
     
    //    for(i=0;i<cLecture->n;i++)
    //    {
    //    printf("%s a pour numero %s \n",cLecture->t_personne[i].nom,cLecture->t_personne[i].num);
    //    //Affiche le nom et numéro de chacun des éléments du tableaux Personne[20]
    //    }
         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
            }
    }
    Dans cette portion, ton i n'est pas initialisé, il a donc une valeur aléatoire et tu n'as aucun contrôle dessus. Du coup, tu ne dois même pas rentrer dans ta boucle. Mets ton incrément à 0 lors de l'initialisation et n'oublie pas de lui mettre un i+=1; dans et à la fin de ta boucle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char i,a,b;//type unsigned-> rien <0 donc 2^8=de 0 à 256
    Pour les puristes, un mot sur 8 bits prend 256 valeurs. En partant de 0, on va jusqu'à 255 = 2^8 - 1

  3. #3
    Membre actif Avatar de Mipwiq
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 42
    Par défaut
    Mets ton incrément à 0 lors de l'initialisation et n'oublie pas de lui mettre un i+=1; dans et à la fin de ta boucle.
    Pas besoin d'incrément pour son while, il est en fonction de la valeur de retour de fgets.

    bouritosse tu devrais essayer d'afficher un message dans ta boucle autre que ton carnet du genre :
    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)
      {
        write(1,"toto",4);
        printf("%s", cLecture->t_personne[i].nom);
      }
    Juste pour vérifier si ton programme va dans ta boucle, tu devrais faire ça aussi avec des messages qui te sont destiné comme des valeurs de variables par exemple.

  4. #4
    Membre chevronné
    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
    Par défaut
    Pas besoin d'incrément pour son while, il est en fonction de la valeur de retour de fgets.
    C'est la valeur du test qui est en fonction du retour de fgets pas la variable i. Comme l'a dit Bysbobo la variable i n'est pas initialisée ni incrémentée il faut donc suivre son conseil.
    "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"

  5. #5
    Membre chevronné
    Homme Profil pro
    Cadre informatique
    Inscrit en
    Avril 2013
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Cadre informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 183
    Par défaut
    Citation Envoyé par Mipwiq Voir le message
    Pas besoin d'incrément pour son while, il est en fonction de la valeur de retour de fgets.
    Euh...

    Pour moi, ce bout de code veut juste dire que j'ai créé une variable i. Ce qu'elle contient peut prendre tout et n'importe quoi, fgets() ou pas. Le fgets() vérifie juste que cLecture->t_personne[i].nom est bien existant.
    Si son carnet fait 10 noms, et que le i ,initialisé à la va-comme-j-te-pousse comme ici, vaut 11, tu peux relancer ton programme parce qu'il n'affichera rien...

  6. #6
    Membre actif Avatar de Mipwiq
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 42
    Par défaut
    Houla ! Oui excusez moi, je regardait la partie conditionnelle du for et pas celle du while, du coup oui Bysbobo a parfaitement raison

  7. #7
    Membre chevronné
    Homme Profil pro
    Cadre informatique
    Inscrit en
    Avril 2013
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Cadre informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 183
    Par défaut
    Sinon le coup des printf() je suis tout à fait d'accord.
    En insérer à droite et à gauche te permet de suivre le fonctionnement de ton programme.
    C'est pas beau et ça ne doit y rester quand tu auras réglé les soucis mais pour déboguer rapidement ça marche bien.
    Genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    printf("j'entre dans la fonction toto");
    printf("j'entre dans la fonction titi");
    printf("mais qu'est ce que je fous dans cette fonction??");

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