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 :

Lecture d'un fichier text/ affichage d'un tableau de données


Sujet :

C++

  1. #1
    Débutant(e)
    Inscrit en
    Mars 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 109
    Points : 64
    Points
    64
    Par défaut Lecture d'un fichier text/ affichage d'un tableau de données
    Bonjour,

    Voici ce que je souhaiterais faire :


    J'ai un fichier text comportant des données relatifs à une classe : supposons par exemple que je possède une classe Personne, et que j'ai un fichier qui contient toutes les peronnes (repérée par un numéro d'identifiant) en lignes avec l'ensemble de leur attributs an colonne séparés par espace par exemple (pour le moment je ne connais pas encore la structure exacte de mon document !) ...

    Ce que j'aimerais faire : c écrire une fonction qui va me pemettre de lire mon document (ça je sais faire) ensuite pour chaque ligne (donc pour chaque personne) j'instancie un nouvel objet de ma classe Personne ... et ensuite je mets chaque objet dans un tableau a deux dimensions où la ligne correspond à un objet de ma classe Personne et les colonnes vont correspondre aux attributs de mes objets de la classe Personne.


    Je vous remercie !

  2. #2
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    J'ai pas très bien compris, pourquoi as-tu besoin d'un tableau à deux dimensions ? Pourquoi les données ne sont pas directement dans les instances de la classe Personne ? Un tableau de Personne ne suffit-il pas ?

  3. #3
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Tout à fait d'accord avec PRomu@ld : pourquoi ne pas faire directement un tableau de Personne ?

    En fait, un std::vector< Personne > suffirait amplement. Si tu as des classes qui héritent de Personne, il te faudra alors un std::vector < Personne* > par exemple. (il y a des solutions bien plus pratiques mais qui risquent d'être un poil plus complexe, selon ton niveau)

  4. #4
    Débutant(e)
    Inscrit en
    Mars 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 109
    Points : 64
    Points
    64
    Par défaut
    Non je suis d'accord avec vous !

    Ce n'est pas vraiment la peine de faire un tableau a deux dimensions un vecteur de pointeur suffirait c juste que je souhiaterais faire ensuite des manipulation sur l'ensemble des attribits de la classe personne, par exemple : faire la somme des ages de chaque personne et je pnsais qu'en créant un tableau c t plus simple de sonner les colonnes séléctionnées ...

  5. #5
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Pas du tout
    std::accumulate ou std::foreach avec un foncteur créé par tes blanches mains sera beaucoup plus élégant, maintenable et pratique !

  6. #6
    Débutant(e)
    Inscrit en
    Mars 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 109
    Points : 64
    Points
    64
    Par défaut
    ok merci !

    supposons que mon fichier contient plusieurs personnes en lignes séparées par des esapaces et en colonne les caractéristiques de ces personnes, séparées par des espaces aussi, le ts dans un fichier .text


    je souhaiterais lire mon fichier.

    est il suffisant d'écrire ceci :

    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
     
     
    int id;
     
    int age;
     
    string nom; 
     
    string prenom;
     
    tant que le fin de fichier n'est pas encore arrivé 
     
     
    {
     
    fichier>>id>>ag>>nom>>prenom;
     
    suite du code .....
     
    }

    est ce qu'il va parcourir ts le fichier ou pas ????

  7. #7
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Oui, mais personnellement je récupèrerais toute une ligne du fichier (avec std::getline(fichier, ligne)) puis je vérifierais qu'elle est au bon format (un nombre, un espace, une chaîne, un espace, etc...). Si tout est ok, je construis une personne avec ces informations et je l'ajoute à mon vector.

  8. #8
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 896
    Points : 1 912
    Points
    1 912
    Par défaut
    Salut,

    Voilà déjà un début de réponse, si ça peut t'être utile.

    Je suis parti de l'idée d'un fichier .txt qui contiendraient le nom, le prénom et le numéro de téléphone, chaque catégorie séparée par un ';'. Lire le fichier consiste à extraire une ligne, puis construire la personne avec des sous-chaînes de cette ligne, ce jusqu'à la fin du fichier. Et effectivement, un tableau à plusieurs dimension ne me paraît pas utile.

    Ce n'est pas très élaboré, il y a certainement des choses à me reprocher, je ne fais pas de contrôles, et je ne sais pas ce que tu veux faire comme fichier, mais ça te donnera une première piste. Les spécifications de std::string (en anglais, désolé) ici :http://www.sgi.com/tech/stl/basic_string.html

    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
     
    // Fichier Personne.h ; à adapter selon les infos que tu manipules
     
    #ifndef PERSONNE_H
    #define PERSONNE_H
     
    #include <string>
     
    class Personne
    {
    private:
    	std::string _nom;
    	std::string _prenom;
    	std::string _tel;
    public:
    	// Constructeur
    	Personne(std::string nom, std::string prenom, std::string tel):
    	  _nom(nom), _prenom(prenom), _tel(tel)
    	 {}
     
    	// Accesseurs pour les membres
    	std::string get_nom() const {return _nom;}
    	std::string get_prenom() const {return _prenom;}
    	std::string get_tel() const {return _tel;}
    };
     
    #endif
    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
     
     
    // Fichier main.cpp
     
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <vector>
     
    #include "Personne.h"
     
    using namespace std;
     
    int main()
    {
     
    	vector<Personne> vp; // Vecteur de Personnes
    	ifstream file; // Variable de fichier en lecture
    	file.open("pers.txt"); // Ouverture du fichier ( avec des ';' en guise de spéarateurs )
    	if(!file) // En cas d'échec à l'ouverture du fichier, message d'erreur et arrêt du programme
    	{
    		cout << "Erreur dans l'ouverture du fichier" << endl;
    		system("pause");
    		exit(1);
    	}
     
    	string line; // Chaîne pour stocker une ligne du fichier
    	file >> line; // Récupération de la première ligne	
    	while(!file.eof()) // Tant qu'on a pas atteint la fin du fichier
    	{
    		size_t a, b;
    		a = line.find(';'); // Emplacement du premier ';'
    		b = line.find(';', a+1); // Emplacement du second ';'
    		// Ajout d'une personne au vecteur, créé à partir d'extractions du contenu de la chaîne
    		vp.push_back(Personne(line.substr(0,a), line.substr(a+1, b-a-1), line.substr(b+1,line.size())));
    		// Simple affichage des données
    		cout << vp.back().get_nom()<< " " << vp.back().get_prenom() << " " << vp.back().get_tel() << endl;
     
    		file >> line; // Récupération de la ligne suivante
    	}
     
    	file.close(); // Fermeture du fichier
     
    	system("pause");
    	return 0;
    }
    Bon courage

  9. #9
    Débutant(e)
    Inscrit en
    Mars 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 109
    Points : 64
    Points
    64
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // Ajout d'une personne au vecteur, créé à partir d'extractions du contenu de la chaîne
    		vp.push_back(Personne(line.substr(0,a), line.substr(a+1, b-a-1), line.substr(b+1,line.size())));

    Bonjour,

    je vous remercie pour votre réponse... j'ai bien compris le raisonnement dans votre code apart la ligne ci dessus, je ne comprends pas tt a fait ce que vous voulez faire et je ne connais pas la fonction substr() ...str c pour dire string ...est ce une conversion ??? ce que je veux moi c que pour chaque ligne correspond un nouvel objet de ma classe (new....)

    cet objet là sera stocké dans le tableau.

  10. #10
    Débutant(e)
    Inscrit en
    Mars 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 109
    Points : 64
    Points
    64
    Par défaut
    je souhaiterais aussi rajouter un autre détail ... pourquoi avez vous déclarer numéro de tél comme étant un string ?? ... Dans mon programme il ne sa'git pas que des string, il y a d'autres types a considérer également !

    Merci.

  11. #11
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par faten7 Voir le message
    je souhaiterais aussi rajouter un autre détail ... pourquoi avez vous déclarer numéro de tél comme étant un string ??
    Vas-tu faire des addition de n° de téléphone ou des soustractions? Non, c'est pourquoi des données qui ont l'air numérique sont représentées en string (n° téléphone, codes postaux, etc...). En plus, cela te permet de stocket des '+33(2)...'. Attention à bien identifier la sémantique d'un attribut plus que sa 'forme'.

  12. #12
    Débutant(e)
    Inscrit en
    Mars 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 109
    Points : 64
    Points
    64
    Par défaut
    il ne s'agit pas ici d'un numéro de téléphone !!!

    et je souhaite faire des additions sur certains des attributs de mes objets !!!

  13. #13
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 896
    Points : 1 912
    Points
    1 912
    Par défaut
    Alors, plusieurs points me semble-t-il :

    Comme l'a expliqué Archi3D, le téléphone est une chaîne de caractère, et non un nombre, puisque qu'on ne fait pas de calcul sur des numéros de téléphone, c'est essentiellement un code, qui utilise des chiffres au lieu de lettre ; je crois qu'à une époque, en Angleterre, on utilisait un mélange de lettres et de chiffres (d'où me semble-t-il un film d'Hitchcock : "Dial M like Murder"). C'est une notion qui vaut aussi pour les bases de données.

    Bien sûr, ici je n'ai stocké que des chaînes de caractères, mais on peut extraire également des nombres. Je ne sais cependant pas ce que tu comptes stocker comme données, alors j'ai improvisé. Ceci-dit, je ne ne connais que la fonction C () atoi (from ascii to int, de caractère vers entier) pour convertir une chaîne en nombre, si quelqu'un a une autre solution (C++), je suis preneur .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    string nb = "10";
    int a = atoi(nb.c_str());

    Pour la fameuse ligne, je vais m'expliquer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vp.push_back(Personne(line.substr(0,a), line.substr(a+1, b-a-1), line.substr(b+1,line.size())));
    C'était pour faire des économies de place (et aussi pour satisfaire un goût contestable pour les formules ésotériques, je l'admets ). En fait, j'ai réuni en une seule ligne plusieurs instructions.

    Tout d'abord le fichier : j'ai préféré utiliser des ';' pour séparer les données, ce qui est une technique simple et courante ; on utilise aussi parfois tabulations. Pourquoi pas des espaces ? Imaginons qu'une personne ait un nom composé de plusieurs nom, comment identifier un espace indiquant un changement de colonne et un espace indiquant un simple espace ; il vaut mieux utiliser comme séparateurs des caractères qui ne seront pas utilisés dans les données, ou le combiner avec un caractère d'échappement.

    Donc, à chaque ligne, on a un ensemble de données séparées par des ';'. Le but va être d'extraire de cette chaîne des sous-chaînes (sub-string) contenant les données à récupérer. Je vais décomposer mes actions.

    Tout d'abord je récupère l'emplacement des ';'.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    size_t a, b;
    a = line.find(';'); // Emplacement du premier ';'
    b = line.find(';', a+1); // Emplacement du second ';'
    Ensuite, je récupère les données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    string nom = line.substr(0,a); // Extraction d'une sous-chaîne de la ligne
    string prenom = line.substr(a+1, b-a-1); // depuis un premier caractère n° n
    string tel = line.substr(b+1,line.size(); // et sur un nombre de caracètres nb
    Je crée une personne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Personne P(nom, prenom, tel);
    Et je l'ajoute :

    Mais on peut remarquer que chaque objet n'est utilisé qu'une fois (sauf pour les positions de ';'). Par conséquent on peut contracter cette écriture en utilisant des objets temporaires.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Personne(line.substr(0,a), line.substr(a+1, b-a-1), line.substr(b+1,line.size()))
    crée un objet Personne, construit à partir de sous-chaînes extraites de la ligne, qui ne sera pas stocké dans une variable, mais directement pris en paramètre par vp.push_back(), et copié dans le vecteur, puis qui sera automatiquement détruit à la fin de l'instruction.

    Bon, après, c'est un truc amusant à faire, comme faire un rébus, mais ça ne signifie pas que ce soit bien : un code lisible reste quelque chose d'important, pour diverses raisons. De plus, il faut remarquer ici que je ne fais pas de vérifications sur les données, sur le format du fichier, etc... ce qui n'est pas une bonne pratique et peut conduire à pas mal de problèmes. Mais je souhaitais ici donner simple un exemple de méthode, que je te laisse adapter de façon plus consciencieuse.

    Voilà, j'espère que c'est plus clair comme ça !

    (Hum, je fais peut-être des posts un peu long.)

  14. #14
    Débutant(e)
    Inscrit en
    Mars 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 109
    Points : 64
    Points
    64
    Par défaut
    Je vous remercie pour votre réponse.

    Non non je trouve que c'est très clair, et pas du tous long surtout lorsqu'on est débutant !

    sinon j'aurais souhité savoir comment faire dans le cas où on a une tabulatio et non pas un (.

    size_t ça fait référence a quoi au juste ???

    merci.

Discussions similaires

  1. Lecture d'un fichier texte et affichage dans flash
    Par TaleMaker dans le forum Flash
    Réponses: 2
    Dernier message: 29/04/2010, 12h18
  2. lecture d'un fichier texte
    Par benahpets dans le forum MFC
    Réponses: 5
    Dernier message: 22/06/2005, 11h50
  3. [C#] Lecture d'un fichier texte (farfelu)
    Par choas dans le forum Windows Forms
    Réponses: 3
    Dernier message: 11/04/2005, 14h33
  4. Lecture d'un fichier Texte
    Par jcharles dans le forum Bases de données
    Réponses: 8
    Dernier message: 27/10/2004, 14h58
  5. Stockage de données & lecture d'un fichier texte
    Par petitours dans le forum C++Builder
    Réponses: 6
    Dernier message: 13/03/2004, 14h05

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