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 :

Problème d'utilisation de structures


Sujet :

C

  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 44
    Par défaut Problème d'utilisation de structures
    bonjour,

    je suis plutôt débutante en langage C et je dois créer une interface (simple, faite avec des printf et scanf) permettant entre autre à un utilisateur d'importer des contacts sur un répertoire, lu dans un fichier contact_.txt qui en contient 100. Mais aussi de faire quelques recherche, ajout, suppression etc...
    contact.txt est sous la forme :
    ==Contact==
    nom
    prénom
    ...
    ==Contact==

    dans mon main, je créer un nouveau fichier repertoire.txt qui contient juste les info des contacts "bout à bout"
    nom
    prénom
    ...

    je veux créer différentes fonctions. La première doit lire les contacts de repertoire.txt et les "stocker" dans une structure Contact (contenue dans main.h, dont le code est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef struct{
        char nom[100];
        char prenom[100];
        char num[100];
        char mail[100];
        char adresse[100];
        char ville[100];
    }Contact;
    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "main.h"
     
     
    #define CONTACT "contacts_.txt"
    #define REPERTOIRE "repertoire.txt"
    #define RDV "rendezvous.txt"
     
    int lireContact(FILE* fichier, Contact* lecontact)
    {
        fichier = NULL;
     
        char copy[100];
     
     
        if (fichier == NULL)
        {
            fprintf(stderr,"ERROR : Can't open repertory file");
            return 0;
        }
        else
        {
            ;
            while(fgets(copy,100,fichier)!= NULL)
            {
     
                lecontact = (Contact*) malloc (sizeof(Contact));
                strcpy(lecontact->nom,copy);
                // Prénom
                fgets(copy,100,fichier);
                strcpy(lecontact->prenom,copy);
                // Num
                fgets(copy,100,fichier);
                strcpy(lecontact->num,copy);
                // Mail
                fgets(copy,100,fichier);
                strcpy(lecontact->mail,copy);
                // Adresse
                fgets(copy,100,fichier);
                strcpy(lecontact->adresse,copy);
                // Ville
                fgets(copy,100,fichier);
                strcpy(lecontact->ville,copy);
            }
            printf("valeur %s",lecontact->ville);
        }
        fclose(fichier);
        return 0;
    }
     
    // Fonction qui ajoute les contacts de contacts.txt au repertoire
    int main(void){
            // initialisation des pointeurs
            FILE *f_contact = NULL;
            FILE *f_repertoire = NULL;
     
            char temp[100];
     
            f_contact=fopen(CONTACT,"r");
            f_repertoire = fopen(REPERTOIRE,"w");
     
             if (f_contact == NULL){
                    fprintf(stderr,"ERROR : Can't open contact file");
                    return 0;
            }
            else{
                    // On génére le fichier binaire repertoire
                    // Ouverture, puis écriture
                    if((f_repertoire == NULL)){
                            fprintf(stderr,"ERROR : Can't create repertoire file");
                            fclose(f_contact);
                            return 0;
                    }
                    else{
                            int in_contact = 1;
                            char* ret;
     
                            ret = fgets(temp,100,f_contact);
                            // Tant qu'on est pas à la fin du fichier
                            while(ret != NULL)
                            {
     
                                    // On test si on dans le champ contact
                                    if(strcmp(temp,"==Contact==\r\n") == 0)
                                    {
                                            in_contact = 1;
                                            // Tant qu'on est dans un même contact
                                            while(in_contact == 1)
                                            {
                                                    in_contact = 1;
                                                    // On lit une autre ligne
                                                    ret=fgets(temp,100,f_contact);
                                                    // Si on est sur un autre contact ou qu'on est à la fin, on sort
                                                    if(strcmp(temp,"==Contact==\r\n") == 0 || ret == NULL)
                                                            in_contact = 0;
                                                    // Sinon on enregistre la ligne si elle n'est pas vide
                                                    else if (strcmp(temp,"\n") != 0)
                                                                    fputs(temp,f_repertoire);
                                            }
                                    }
                                    else // ligne superflu avant ou entre contacts
                                            ret=fgets(temp,100,f_contact);
                                    }
                            }
     
                    }
                    printf("Copy success \n");
                    fclose(f_repertoire);
                    fclose(f_contact);
     
            Contact lecontact;
            FILE* fichier;
            fichier = NULL;
            fichier = fopen(REPERTOIRE,"r");
            lireContact(fichier,&lecontact);
     
            return 0;
     
    }
    mon code semble fonctionner mais :

    Le soucis est que je ne comprends pas très bien comment gérer ma structure, comment voir si elle fonctionne, comment stocker plusieurs contacts et je suis un peu coincée pour la suite ... par exemple pour quelques recherche :/
    en effet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("valeur %s",lecontact->ville);
    m'affiche la dernière ville lue dans le fichier repertoire. Comment accéder aux autres ?
    Pouvez vous m'aider svp ?
    Merci d'avance

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Pour commencer quelques remarques sur ton code :
    1. Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      int lireContact(FILE* fichier, Contact* lecontact)
      {
          fichier = NULL;
      
          char copy[100];
      
          if (fichier == NULL)
      La première ligne rouge n'a rien à faire ici. Vu que tu mets fichier à NULL juste avant, ton test sera toujours vrai, même si tu as ouvert ton fichier avec succès.
    2. Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      int lireContact(FILE* fichier, Contact* lecontact)
      {
          // ...
          if (fichier == NULL)
          {
              fprintf(stderr,"ERROR : Can't open repertory file");
              return 0;
          }
          // ...
          return 0;
      }
      Là, qu'il y ait une erreur ou non, tu renvoies 0... difficile de savoir donc si la fonction s'est bien exécutée correctement ou non.
    3. Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      while(fgets(copy,100,fichier)!= NULL)
      {
          lecontact = (Contact*) malloc (sizeof(Contact));
          // ....
      }
      ici tu as une belle fuite de mémoire : allocation en boucle sans aucun free() ni stockage des adresses.
    4. Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      fichier = fopen(REPERTOIRE,"r");
      lireContact(fichier,&lecontact);
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      int lireContact(FILE* fichier, Contact* lecontact)
      {
          // ...
          fclose(fichier);
      }
      J'aime moyennement ce fclose() à l'intérieur de la fonction avec le fopen() associé en dehors. Préfère mettre les deux au même niveau.
    5. Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      while(in_contact == 1)
      {
          in_contact = 1;
      Si on est entré dans le while, c'est qu'elle est déjà à 1 Cette ligne est donc inutile.
    6. Enfin sache que le pointeur int lireContact(FILE* fichier, Contact* lecontact) n'est qu'une copie de celui passé ici lireContact(fichier,&lecontact);. Donc ta ligne avec malloc() ne modifiera pas ta donnée d'origine.


    Venons-en à ce problème de stockage
    Tu souhaites stocker plusieurs Contact, et tu ne sais pas à priori combien : tu auras donc besoin d'un pointeur que tu alloueras au final au nombre contenu dans le fichier.
    À partir de là, tu as deux approches possibles :
    1. Soit effectuer une première passe en comptant les lignes ==Contact==, allouer ton pointeur
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      contacts = malloc(nbContacts * sizeof(Contact));
      puis refaire le parcours pour remplir les cases ;
    2. Soit n'en faire qu'une et utiliser realloc() au fur et à mesure.

    Dans les deux cas, il te faudra passer un pointeur sur pointeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int lireContact(FILE* fichier, Contact** contacts)
        *contacts = malloc/realloc(/*...*/);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Contact *contacts;
    lireContact(fichier,&contacts);
    Pense aussi que tu auras besoin de savoir une fois la fonction lireContact() exécutée le nombre de contacts lus/alloués, le b) serait alors à considérer

    Une autre façon de stocker tes contacts serait l'utilisation d'une liste chaînée.

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 44
    Par défaut
    Merci beaucoup pour votre réponse très détaillé !!

    Je suis arrivée hier soir à faire fonctionner le code mais certes il n'est pas très "propre" et je vais suivre vos suggestions pour le rendre...

    J'ai effectivement ajouter une variable nbContact qui lit le nombre de contact dans le fichier de départ et je la passe en argument de la fonction lireContact.

    Voici donc mon code qui fonctionne :
    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
    int lireContact(FILE* fichier, Contact* lecontact, int nbContacts,Contact** save_contact)
    {
        fichier = NULL;
     
        char copy[100];
        fichier = fopen(REPERTOIRE,"r");
     
        int i=0;
     
        if (fichier == NULL)
        {
            fprintf(stderr,"ERROR : Can't open repertory file");
            return 0;
        }
        else
        {
     
            while(fgets(copy,100,fichier)!= NULL)
            {
                // Allocation de la mémoire pour chaque nouveau contact
                lecontact = (Contact*) malloc (sizeof(Contact));
                strcpy(lecontact->nom,copy);
                // Prénom
                fgets(copy,100,fichier);
                strcpy(lecontact->prenom,copy);
                // Num
                fgets(copy,100,fichier);
                strcpy(lecontact->num,copy);
                // Mail
                fgets(copy,100,fichier);
                strcpy(lecontact->mail,copy);
                // Adresse
                fgets(copy,100,fichier);
                strcpy(lecontact->adresse,copy);
                // Ville
                fgets(copy,100,fichier);
                strcpy(lecontact->ville,copy);
                // Sauvegarde contact dans un tableau de structure
                save_contact[i]=lecontact;
                i++;
     
     
            }
            free(lecontact);
        }
        printf("%s",save_contact[1]->nom);
        // fermeture du fichier
        fclose(fichier);
        return 0;
    }
    J'espère avoir libérer la mémoire où il le fallait.
    Cette fonction marche bien le printf m'affiche la bonne valeur donc je suis contente (même si certes mon code n'est pas très "propre"...)

    Je suis en train maintenant de faire des fonctions de recherches et là, c'est un peu plus complexe pour moi...

    bon si je récapitule, j'ai un tableau de pointeurs save_contact[nbContacts] dont chaque case pointe vers un élément de la structure à savoir un contact.

    Je souhaites faire des recherches du genre "afficher les informations du contact du nom de Durand" etc...

    Mon soucis est que je n'arrive pas à créer une fonction "générale" qui puisse autant rechercher en fonction du nom, du prénom, ou d'autres choses...

    Comment gérer avec ma structure de tels recherches? :/

  4. #4
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int lireContact(FILE* fichier, Contact* lecontact, int nbContacts,Contact** save_contact)
    {
        fichier = NULL;
     
        char copy[100];
        fichier = fopen(REPERTOIRE,"r");
    Alors je vois que tu as choisi de mettre les deux dans la fonction. Tu n'as alors plus besoin de passer fichier en paramètre de même lecontact

    Citation Envoyé par melissar Voir le message
    J'espère avoir libérer la mémoire où il le fallait.
    Je suis au regret de te dire non.
    De 1), tu exécutes normalement nbContacts fois la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lecontact = (Contact*) malloc (sizeof(Contact));
    Tu alloues donc nbContacts contacts en mémoire.
    Or le free(lecontact); que tu as placé après la boucle ne fait que libérer le dernier.
    De 2) en considérant que ton free() les ait tous libéré, que comptes-tu ressortir avec ton save_contact() ? Tu vas pointer vers des espaces mémoires qui ont été libérés, et qui peuvent donc contenir n'importe quoi.
    Ce n'est pas dans la fonction que tu doit les libérer, mais à l'extérieur une fois que tu auras fini d'utiliser ces contacts que tu as lu.

    Pour la recherche, il te suffit de simplement parcourir les contacts avec une boucle et t'arrêter à/stocker l'élément qui correspond au critère recherché.

    PS : Je te laisse corriger d'autres points déjà mentionnés dans mon premier message

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 44
    Par défaut
    si je comprends bien le raisonnement il faut donc qu'à la fin de mon Programme je fasse un free du tableau de pointeurs save_contact, c'est bien celà?

  6. #6
    Invité
    Invité(e)
    Par défaut
    Tu dois avoir autant de free() que de malloc() effectués, et ceci sur les mêmes adresses retournées par malloc(), et entre les deux (et seulement) l'utilisation de cette mémoire (stockage des contacts, recherche...).

  7. #7
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    il faut que pour chaque malloc, un free soit fait avec la même adresse en argument. (pour les fuites mémoire, calloc est équivalent à malloc: c'est une allocation)

    mathématiquement parlant:
    pour toute adresse différente de NULL retournée par malloc au cours de l’exécution du programme, il y a un et un seul appel de free utilisant cette adresse.

    Ceci est la version simple.
    Il faut tenir compte du fait que realloc appelle free sur l'ancienne adresse et en retourne une autre (ou ne compte pas).
    Par ailleurs, free(NULL) ne provoque jamais d'erreur, il ne se passe juste rien.

    Il faut aussi que chaque accès à une adresse se fasse sur de la mémoire effectivement allouée. (soit via un pointeur construit via une prise d'adresse d'une variable encore vivante, soit sur une adresse issue d'un malloc)

  8. #8
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 44
    Par défaut
    Daccord merci beaucoup

    j'ai mon code de recherche qui me pose soucis maintenant :

    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
    void searchContact(char* champ,char* toSearch,Contact** save_contact, int nbContacts)
    {
        int i = 0;
     
        for(i=0;i<nbContacts;i++)
        {
            if (save_contact[i]->champ == toSearch)
                {
                    printf("%s",save_contact[i]->nom);
                    printf("%s",save_contact[i]->prenom);
                    printf("%s",save_contact[i]->num);
                    printf("%s",save_contact[i]->mail);
                    printf("%s",save_contact[i]->adresse);
                    printf("%s",save_contact[i]->ville);
                }
        }
    }
    Comme vous pouvez vous en douter, celà me donne des erreurs...
    (si j'appelle la fonction comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    searchContact(nom,xmjinukhdcdjhaywkicjwbuaiqcflwgydy,save_contact,nbContacts);
    = je veux chercher le contact qui a pour nom xmjinukhdcdjhaywkicjwbuaiqcflwgydy)

    Cette ligne me mets une erreur, mais je ne vois pas d'autre manière de faire pour que champ prenne les valeurs nom, prénom ... en fonction de ce que l'utilisateur va demander à cherche !

  9. #9
    Invité
    Invité(e)
    Par défaut
    On ne compare pas des chaînes de caractères avec l'opérateur ==, mais avec la fonction strcmp()
    FAQ Comment comparer 2 chaînes de caractères ?

  10. #10
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 44
    Par défaut
    Oh mon dieu la bouletteµ...

    en plus je l'ai fais plein de fois dans mon code.

    Mais le soucis c'est que l'erreur me dit que "contact as no member of champ"
    En gros je ne trouve pas de solution pour que "champ" prenne la valeur "nom", ou "prenom" ou ... choisi par l'utilisateur et donné en paramètre de la fonction...


    :/

  11. #11
    Invité
    Invité(e)
    Par défaut
    Ta structure ne contient que les champs nom, prenom, num, mail, adresse, ville, mais pas champ, tu ne peux donc pas directement faire cela. De là tu peux créer une fonction getField() du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    char * getField(Contact *contact, const char *fieldName) {
        if( !strcmp(fieldName, "nom") )
            return contact->nom;
        if( !strcmp(fieldName, "prenom") )
            return contact->prenom;
        // etc
    }

  12. #12
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 44
    Par défaut
    Outch j'ai du mal

    De 1: pourquoi un const devant le char ?

    De 2 : fieldName est la valeur entrée par l'utilisateur ?

    De 3 : cette fonction va me retourner un char* directement exploitable ? cad que je peux faire temp = getField() ... save_contact[i]->temp ?
    ça fera le même chose non ?

  13. #13
    Invité
    Invité(e)
    Par défaut
    1. Un peu de lecture
    2. fieldName est ton champ en fait.
    3. Non comme je t'ai dit, tes seuls champs disponibles sont ceux que tu as fixé au début, et seulement ceux-là. Cette fonction retournera directement le contenu du champ désigné par fieldName.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      strcpy(fieldName, "ville");
      char * ville = getField(save_contact[i], fieldName)
      // équivalent à :
      char * ville = save_contact[i]->ville;

  14. #14
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 44
    Par défaut
    OULAHLAH

    bon je recapitule

    jai :
    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
     
    char * getField(Contact *contact, const char *fieldName)
    {
        if( !strcmp(fieldName, "nom") )
            return contact->nom;
        if( !strcmp(fieldName, "prenom") )
            return contact->prenom;
        if( !strcmp(fieldName, "num") )
            return contact->num;
        if( !strcmp(fieldName, "mail") )
            return contact->mail;
        if( !strcmp(fieldName, "adresse") )
            return contact->adresse;
        if( !strcmp(fieldName, "ville") )
            return contact->ville;
    }
    qui me retourne le champ choisi par l'utilisateur

    je veux maintenant le comparer avec ce à quoi il doit être égal (ex : durand), et celà, pour tous les contacts contenu dans save_contact

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // Fonction qui recherche un contact en fonction du nom, prénom ... ou autres
    void searchContact(Contact** save_contact, int nbContacts)
    {
        char fieldName[10];
        char egual[100];
     
        printf("what's the field concerned by the search ?\n");
            scanf("%s",fieldName);
        printf("it supposed to be egual to?");
            scanf("%s",egual);
     
        char * ville = getField(save_contact[i], fieldName) // équivaut à char * ville = save_contact[i]->ville;
     
    }
    mais comment je gere le i (qui se balade dans mes contacts) ?

  15. #15
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par melissar Voir le message
    qui me retourne le contenu du champ choisi par l'utilisateur
    On va récapituler d'un peu plus haut

    Ce qui te posait problème c'était ton save_contact[i]->champ car champ était dynamique et que tu ne pouvais donc pas l'utiliser directement tel quel. On a donc réglé le problème avec ma fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    save_contact[i]->champ
    // devient : 
    getField(save_contact[i], champ)
    Il reste donc à la remplacer, tout en utilisant la fonction strcmp() pour comparer des chaînes de caractères :
    Citation Envoyé par melissar 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
    16
    17
    void searchContact(char* champ,char* toSearch,Contact** save_contact, int nbContacts)
    {
        int i = 0;
    
        for(i=0;i<nbContacts;i++)
        {
            if ( !strcmp(getField(save_contact[i], champ) , toSearch) )
                {
                    printf("%s",save_contact[i]->nom);
                    printf("%s",save_contact[i]->prenom);
                    printf("%s",save_contact[i]->num);
                    printf("%s",save_contact[i]->mail);
                    printf("%s",save_contact[i]->adresse);
                    printf("%s",save_contact[i]->ville);
                }
        }
    }
    C'est tout

    Remarque : pour une saisie plus sécurisée, je te conseille fgets à la place de scanf.

  16. #16
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 44
    Par défaut
    OK

    Ah j'ai tout compris grâce à vous merci beaucoup...

    j'avais commencer à m'embarquer dans un switch mais c'était vraiment moche....
    ma fonction me retourne le numéro du contact, que je vais ainsi pouvoir traiter, pour la suppression par exemple

    Je commence maintenant une fonction qui supprime le contact de mon fichier

  17. #17
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 44
    Par défaut
    Nouveau petit soucis : je veux supprimer un contact (le numéro num_c) de mon fichier repertoire.
    Pour celà je recopie ceux avant et après dans un fichier temporaire que je veux ensuite renommé...

    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
    // Fonction qui supprime un contact recherché
    void deleteContact(int num_c,FILE* fichier,Contact** save_contact)
    {
        fichier = NULL;
        FILE* f_temp = NULL;
     
        // Ouverture du fichier en mode lecture
        fichier = fopen(REPERTOIRE,"r");
        f_temp = fopen("temp.txt","w");
     
     
        char t[100];
     
     
     
        if (fichier == NULL)
        {
            fprintf(stderr,"ERROR : Can't open repertory file");
            return 0;
        }
     
        else
        {
            // Copie des contacts avant celui à supprimer
            fgets(t,100,fichier);
     
            while( strcmp(t,save_contact[num_c-1]->nom) != 0 )
            {
                fputs(t,f_temp);
                fgets(t,100,fichier);
     
            }
     
            fgets(t,100,fichier);
            fgets(t,100,fichier);
            fgets(t,100,fichier);
            fgets(t,100,fichier);
            fgets(t,100,fichier);
            while(fgets(t,100,fichier)!= NULL)
            {
     
                fputs(t,f_temp);
            }
            fclose(f_temp);
            rename("temp.txt",REPERTOIRE);
        }
     
     
    }
    Problème ? Rename ne fonctionne pas...

    j'ai essayer de plusieurs façon pour ne pas que mon fichier temporaire ne reste. Si je renome en c est ce que ça peut écraser un fichier déjà existant ? si non, comment faire pour ne pas utiliser de fichier temporaire?

  18. #18
    Invité
    Invité(e)
    Par défaut
    Tu as oublié fclose(fichier);, REPERTOIRE est donc toujours ouvert en lecture, et bloque son écrasement.

  19. #19
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 44
    Par défaut
    OUI

    Il fallait juste que je suprimer l'ancien fichier repertoire.txt avant de pouvoir renommer !!

    Merci beaucoup

    J'aurai une autre petite question pour la suite de mon projet...

    si j'ai un char* qui contient par exemple "aleodmp" comment puis-je faire pour tester si le premier caractère (ici "a") est un int ou un char?

Discussions similaires

  1. Problème d'utilisation structure PROCESSENTRY 32
    Par yoshi84300 dans le forum Visual C++
    Réponses: 5
    Dernier message: 25/02/2013, 15h41
  2. Réponses: 1
    Dernier message: 29/01/2013, 14h44
  3. Problème d'utilisation de structure en C++
    Par marcix dans le forum C++
    Réponses: 1
    Dernier message: 08/12/2007, 12h47
  4. Problème d'utilisation de Mysql avec dev-c++
    Par Watchi dans le forum Dev-C++
    Réponses: 10
    Dernier message: 06/08/2004, 14h35
  5. problème d'utilisation avec turbo pascal 7.0
    Par le 27 dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 03/12/2003, 10h44

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