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 fichier texte dans une liste ?


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 44
    Points : 44
    Points
    44
    Par défaut Charger fichier texte dans une liste ?
    Bonjour, j'ai beaucoup hésité avant de poster ce topic, j'ai cherché dans les forums et sur le Net, mais j'ai rien trouvé qui pourrait m'aider.

    Je dois rendre un TP qui gère les notes d'étudiants fictifs, où les élèves et les notes sont stockés dans un fichier texte.

    Or, jusque là tout va bien, mais je bloque depuis plusieurs jours sur un point crucial :

    il faut charger le contenu du fichier texte dans une liste, mais je ne vois pas comment faire du tout.

    Voici pour le moment 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
     
    /*A* Dans un premier temps, on définit une structure Etudiant1 
    adaptée afin de stocker les notes de chaque étudiant : */
     
    struct  enreg1{
                     char* nom ;
                     double * ListeNotes ;
                  };
     
    typedef struct enreg1 info1 ;
     
    struct etudiant1{ 
       info1 val ;
     
    struct etudiant1 * suiv ;
    } ;
     
    typedef struct etudiant1 Etudiant1 ;
    typedef struct etudiant1* ListeEtudiant1 ; 
     
     
    /*Dans un deuxième temps, on définit une autre structure Etudiant2 adaptée pour 
    stocker la moyenne, la note la plus basse et la note la plus haute de chaque étudiant.*/
     
    struct enreg2{
                    char* nom ;
                    double moyenne,
                    double notebasse ;
                    double notehaute ;
                 } ;
     
    typedef struct  enreg2  info2 ;
    struct etudiant2{ 
       info2 val ;
     
    struct etudiant2 * suiv ;
    } ;
     
    typedef struct etudiant2 Etudiant2 ;
    typedef struct etudiant2* ListeEtudiant2 ;

    Voici un aperçu du contenu du fichier texte :

    Alexandre Thomas 12 14 16
    Dupont Pierre 17 13 15 15



    Pourriez-vous m'indiquer la marche à suivre pour charger les données de ce fichier dans une liste ?

  2. #2
    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 : 46
    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



    Il faut que tu lises ton fichier ligne par ligne avec la fonction fgets. Pour chaque ligne correspond donc un nouveau nœud de ta liste. A chaque ligne tu peux par exemple extraire les données une à une avec la fonction sscanf ou encore strtok plus long à mettre en œuvre.
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  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
    - Personnellement, je te déconseille l'utilisation de deux listes d'étudiants parce que les informations de la deuxième liste se déduisent de celles contenues dans la première. De simples fonctions permettent donc d'obtenir les informations de la deuxième liste à partir du contenu de la première.
    Par contre, l'utilisation de deux listes oblige à mettre à jour les informations de la deuxième liste en synchronisme avec celles de la première (et surtout à ne pas oublier de le faire en aucune circonstance) ; de doubler le code (création/destruction d'un élément ; insertion/extraction/recherche dans la liste... ; augmentation de l'occupation mémoire...

    - info1 contient les informations concernant un étudiant. Bien que les évaluations des compétences d'un étudiant soient faites avec le plus grand sérieux par les professeurs, je doute que la précision de ces évaluations justifie l'utilisation de double plutôt que de float.

    - Etudiant1 est un maillon de la chaine qui contient un info1. Il serait peut-être plus souple qu'elle incorpore plutôt un pointeur sur un info1 (par exemple, ceci faciliterait les tris de la liste si le besoin s'en faisait sentir). De plus, ça découple mieux la question des infos de celle de la gestion de la liste.

    - Il reste la question du nombre de notes : Est-il une donnée du problème à priori ou sera t-il déterminé par la lecture du fichier ?

    - Pour résumer, je vois une structure de données du genre :

    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
    typedef struct{
       char* nom ;
       float * ListeNotes ; // avec la question en suspens du nombre de notes
    }Info;
     
    typedef struct etudiant{ 
       Info *val ; 
       struct etudiant * suiv ;
    } Etudiant;
     
    typedef Etudiant* ListeEtudiant;
     
    float moyenne(Info * info);
    float noteBasse(Info * info);
    float noteHaute(Info * info);
    - La première chose à faire, est d'écrire une fonction qui crée une structure Info et une fonction qui la détruise (et peut-être une fonction qui attribue les notes). Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Info * creerInfo(char * nom);
    void detruireInfo(Info * info);
    void donner Note(Info * info, float note, size_t indexnote);
    - L'étape suivante est d'écrire une fonction qui insère ces Info dans la liste et une fonction qui détruise la liste et les Info qu'elles recense. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Etudiant * insereInfo(ListeEtudiant liste, Info * info);
    void detruireListe( ListeEtudiant liste);
    - Ensuite, on peut se poser la question de la lecture des informations dans le fichier et de leur exploitation.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 44
    Points : 44
    Points
    44
    Par défaut
    Voici mon code pour le moment. J'arrive à isoler le nom, le prénom ainsi que les notes pour chaque étudiant.

    Mais je ne vois toujours pas comment faire pour mettre toutes ces valeurs dans les listes déclarées.

    Sauriez-vous me mettre sur la voie ?




    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
     
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #define TAILLE_MAX 10000
     
    struct enreg1{
                    char* nom;
                    double* ListeNotes;
                };
    typedef struct enreg1 info1;
     
    struct etudiant1{
                        info1 val;
                        struct etudiant1* suiv;
                    };
    typedef struct etudiant1 Etudiant1;
    typedef struct etudiant1* ListeEtudiant1;
     
     
    struct enreg2{
                    char* nom;
                    double moyenne;
                    double notebasse;
                    double notehaute;
                };
    typedef struct enreg2 info2;
     
    struct etudiant2{
                        info2 val;
                        struct etudiant2* suiv;
                    };
    typedef struct etudiant2 Etudiant2;
    typedef struct etudiant2* ListeEtudiant2;
     
     
     
    main()
    {
    // Variables
    FILE* fichier = NULL;
    int i=0;
    char choix[10];
    char tmp[TAILLE_MAX] = ""; // Chaîne vide de taille TAILLE_MAX
    char* p;
    char* p1;
    char* p2;
    char* p3;
    char* p4;
    char nom[1000];
    char notes[1000];
    char prenom[1000];
    char* buffer;
    char* pnom;
    char* pprenom;
     
     
    fichier = fopen("notes_etudiants.txt", "r");
     
    if (fichier != NULL)
        {
            while(!feof(fichier)) // Tant que non fin de fichier (feof: file end of file)
    		{
                fgets(tmp, TAILLE_MAX, fichier); // On lit maximum TAILLE_MAX caractÚres du fichier, on stocke le tout dans "chaine"
                buffer = strdup ( tmp ); // ??????????????
                pnom=strtok(buffer," ");
                pprenom=strtok(NULL," ");
                p1=strstr(tmp," ");
                p3=strstr(p1+1," ");
                p3=strcpy(notes,p3+1);
                p4='\0';
     
                printf("%s", tmp); // On affiche la chaîne
                printf("\t Nom :%s \n", pnom); // On affiche la chaîne
                printf("\t Prenom :%s \n", pprenom); // On affiche la chaîne
                printf("\t Notes :%s \n", notes); // On affiche la chaîne
    		}
    		//fclose(fichier);
    	}
    else
    	{
    	    printf("Impossible d'ouvrir le fichier notes-etudiants.txt \n");
    	}
    }

Discussions similaires

  1. stocker un fichier texte dans une liste
    Par dougie dans le forum C
    Réponses: 6
    Dernier message: 11/01/2011, 13h58
  2. [Forms6I] charger un fichier texte dans une table
    Par Herveg dans le forum PL/SQL
    Réponses: 2
    Dernier message: 26/02/2010, 09h28
  3. importer fichiers texte dans une liste
    Par mcalus dans le forum Général Python
    Réponses: 7
    Dernier message: 29/01/2009, 14h17
  4. Réponses: 1
    Dernier message: 17/03/2008, 10h21
  5. PHP5: charger des fichiers textes dans une base MYSQL
    Par koueletbak dans le forum Requêtes
    Réponses: 4
    Dernier message: 23/03/2006, 11h14

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