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 :

Charger les infos d'un fichier dans des structures


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2011
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Charger les infos d'un fichier dans des structures
    Bonjour à tous!

    Je viens de m'inscrire car pour un fois je n'ai pas trouvé de solution à mon problème sur internet... J'ai vu beaucoup de messages un peu similaire mais sans aucune réponse satisfaisante. Je ne repose pas les mêmes questions, je viens avec mon programme tout beau mais buggé...

    Je m'explique: je souhaite enregistrer dans des structures mes infos trouvées dans un fichier. C'est les infos de livres. Sur chaque lignes on y trouve l'ID, le statut, la catégorie et le titre; ex:
    c523565G43*present*info*langueC*
    987d71d34*absent*elec*puissance*
    ID*STATUT*CATEGORIE*TITRE
    J'ai donc écrit mon ptit programme (cf ci-dessous), qui compile bien. L'idée est de lire ligne par ligne, à chaque caractère on ajoute dans un buffer jusqu'à trouver une "*". On met ainsi le buffer dans le position voulu (librairie[i].ID par exemple).

    Ce programme compile sans erreur et sans warnings, mais quand je le lance il plante... J'utilise code::blocks. J'ai mis quelques balises et ça plante entre 4 et 5.

    Voici donc mon programme:
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    struct mastruct
    {
        char ID[15];
        char status[10];
        char categorie[100];
        char titre[100];
    };
     
    int main()
    {
        struct mastruct librairie[20];
        strcpy(librairie[1].ID, "1234Fr3");
        printf("1\n");
        char recup[20];
        char ligne[25];
        char c = 'a';
        int i=0;
        FILE *fichier;//Pointeur fichier classes.txt
        fichier=fopen("livre.txt","r");
     
        printf("2\n");
     
        while(fgets(ligne,25,fichier) != NULL)
        {
            i++;
            printf("3\n");
            //ID
            while(c=(char)fgetc(fichier)!='*')
            {
                printf("4\n");
                strcat(recup,c);
                printf("5\n");
            }
            strcpy(librairie[i].ID,recup);
            strcpy(recup,"");
            //Status
            while(c=(char)fgetc(fichier)!='*')
            {
                strcat(recup,c);
            }
            strcpy(librairie[i].ID,recup);
            strcpy(recup,"");
            //Categorie
            while(c=(char)fgetc(fichier)!='*')
            {
                strcat(recup,c);
            }
            strcpy(librairie[i].ID,recup);
            strcpy(recup,"");
            //Title
            while(c=(char)fgetc(fichier)!='*')
            {
                strcat(recup,c);
            }
            strcpy(librairie[i].ID,recup);
            strcpy(recup,"");
        }
        fclose(fichier);
     
        int m = 1;
     
        for(m = 1; m<=2; m++)
        {
            printf("ID %d: %s\n", m, librairie[m].ID);
            printf("Status %d: %s\n", m, librairie[m].status);
            printf("Categorie %d: %s\n", m, librairie[m].categorie);
            printf("Titre %d: %s\n", m, librairie[m].titre);
        }
        return 0;
    }
    J'espère que quelqu'un pourra m'aider.

    Merci d'avance!

  2. #2
    Modérateur
    Avatar de Overcrash
    Homme Profil pro
    Architecte Logiciel et responsable CRM (Salesforce)
    Inscrit en
    Mai 2008
    Messages
    1 254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Architecte Logiciel et responsable CRM (Salesforce)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 254
    Points : 1 875
    Points
    1 875
    Par défaut
    Bonjour,

    mais quand je le lance il plante...
    c'est à dire ? segfault ? message ?

    Il plante au premier passage de la boucle ?
    Tu peux aussi tester la valeur de retour de strcat.

  3. #3
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    - Ces while() sont incorrects :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while(c=(char)fgetc(fichier)!='*') erreur : équivalent à c=(fgetc(fichier)!='*')
    while((c=fgetc(fichier))!='*') correct; il faut parenthèser le c=fgetc
    - Ces strcat(recup,c); sont incorrects : le deuxième argument doit être une chaine de caractères terminée par '\0' (et pas un char) et recup également (mais qui n'est pas dans ce code terminée par '\0' au début de l'exécution)

    - l'analyse de ligne pourrait être faite avantageusement en utilisant strtok() (voir la doc sur cette fonction) ou même sscanf()

  4. #4
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2011
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Je compile sous Code::blocks donc il ne m'affiche pas les segmentations défault. Mais à mon avis c'est ça. J'ai un message d'erreur qui me dit "Le programme ***.exe a cessé de fonctionner".
    Et oui, le programme se plante dès la première boucle. J'ai testé la valeur de retour de strcat mais je n'ai rien. Je concatène un caractère à une chaîne de caractères, c'est possible de faire ça ou il faut absolument deux chaînes de caractères?

    Merci

    EDIT: Je viens de voir ta réponse Diogene, j'essaie avec ces infos.

  5. #5
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2011
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Désolé du doublon.

    J'ai réussi à faire ce que je voulais! Merci de votre aide! Je passe le thread en résolu et je colle mon code pour les suivants.

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    struct mastruct
    {
        char ID[15];
        char status[10];
        char categorie[100];
        char titre[100];
    };
     
    void add_caractere(char* s,char c);
     
    int main()
    {
        struct mastruct librairie[20];
        strcpy(librairie[1].ID, "1234Fr3");
        char recup[20];
        char ligne[100];
        char c;
        int i=0;
        FILE *fichier;//Pointeur fichier classes.txt
        fichier=fopen("livre.txt","r");
     
     
        do{
     
            //ID
            do{
                c=fgetc(fichier);
                //printf("\n%d __ C: %c\n", i, c);
                if(c != '*')
                       add_caractere(recup, c);
                //printf("recup: %s ;\t c= %c\t", recup,c);
                //system("pause");
            }while(c != '*');
     
            strcpy(librairie[i].ID,recup);
            strcpy(recup,"");
     
     
            //STATUS
            do{
                c=fgetc(fichier);
                //printf("\n%d __ C: %c\n", i, c);
                if(c != '*')
                        add_caractere(recup, c);
                //printf("recup: %s ;\t c= %c\t", recup,c);
                //system("pause");
            }while(c != '*');
     
            strcpy(librairie[i].status,recup);
            strcpy(recup,"");
     
            //CATEGORIE
            do{
                c=fgetc(fichier);
                //printf("\n%d __ C: %c\n", i, c);
                if(c != '*')
                         add_caractere(recup, c);
                //printf("recup: %s ;\t c= %c\t", recup,c);
                //system("pause");
            }while(c != '*');
     
            strcpy(librairie[i].categorie,recup);
            strcpy(recup,"");
     
            //TITRE
            do{
                c=fgetc(fichier);
                //printf("\n%d __ C: %c\n", i, c);
                if(c != '*')
                      add_caractere(recup, c);
                //printf("recup: %s ;\t c= %c\t", recup,c);
                //system("pause");
            }while(c != '*');
     
            strcpy(librairie[i].titre,recup);
            strcpy(recup,"");
     
     
     
            printf("LIVRE %d: \nID%d: %s \n", i, i, librairie[i].ID);
            printf("Status%d: %s \n", i, librairie[i].status);
            printf("Categorie%d: %s \n", i, librairie[i].categorie);
            printf("Titre%d: %s \n\n", i, librairie[i].titre);
     
     
            i++;
        }while(fgets(ligne,100,fichier) != NULL);
     
        fclose(fichier);
        int m = 1;
     
    //    for(m = 1; m<=2; m++)
    //    {
    //        printf("ID %d: %s\n", m, librairie[m].ID);
    //    }
    //    return 0;
    }
     
    void add_caractere(char* s,char c)
    {
        size_t t=strlen(s);
        s[t+1]='\0'; // pas d'espace entre \ et 0 mais pour voir dans le forum il faut un espace
        s[t]=c;
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 12/10/2008, 03h28
  2. charger les données d'un fichier .txt dans une table
    Par lemerite dans le forum Développement
    Réponses: 6
    Dernier message: 10/09/2008, 18h33
  3. Réponses: 1
    Dernier message: 15/06/2006, 15h17
  4. [Info] ajout de fichier dans des projets eclipse
    Par root76 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 16/12/2005, 12h48

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