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

SL & STL C++ Discussion :

Problème E/S fichier fstream


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 5
    Par défaut Problème E/S fichier fstream
    Bonjour,

    je suis débutant en C++ et je suis nouveau dans ce forum. Je travaille sur un programme où je veux ouvrir un fichier texte et stocker les données dans une structure.

    la structure est un tableau de structures.
    le fichier donnee.txt est ecrit de la manière suivante:

    int string string
    num1 nom1 prenom1
    num2 nom2 prenom 2
    ...

    Mon probleme se trouve dans la fonction lire(,). lorsque (après avoir compté le nombre de lignes dans le fichier dans la fonction init(,) ) le programme ne se positionne pas au debut du fichier pr lire les données et les stocker une à une dans la structue. J'ai pense qu'il y a aussi un probleme dans la structure de données ou dans la syntaxe pr lecriture dans la structure.

    Merci de m'aider à resoudre ce problème.
    Bonne journée à tous

    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
     
    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std;
     
    struct etudiant
    {
    	int num;
    	string nom;
    	string prenom;
    };
    struct etuds
    {
    	etudiant *cont;
    	int taille;
    };
     
    void afficher(etudiant &e)
    {
    	cout << e.num << e.nom << e.prenom << endl;
    }
     
     
    void lire (etuds &e, ifstream &fichier_entree)
    {
    	int j=0;
     
    	//Probleme repositionnement à l'entete du fichier
     
    	while (!fichier_entree.eof()) //.eof retourne tjrs 1: 
    					     //impossible de se repositionner au debut
    	{		
    	        fichier_entree >> e.cont[j].num >> e.cont[j].nom >> e.cont[j].prenom; // Probleme structure 
     
    		j++;
    	}
     
    }
     
     
    void init(etuds &e, ifstream &fichier_entree)
    {
    	char buf[1024];
    	int n=0;
    	while(!fichier_entree.eof())
    	{
    		fichier_entree.getline(buf,1024);
    		n++; //compteur nombre de lignes dans le fichier
    	}
     
    	e.cont=new etudiant[n];
    	e.taille=n;
     
    }
     
     
    int main()
    {
     
    	etuds e;
    	ifstream fichier_entree("c:/donnee.txt");
     
    	init(e, fichier_entree);
    	lire (e, fichier_entree);
     
    	for(int i=0; i<e.taille;i++)
    		afficher(e.cont[i]);
     
    	return 0;
    }
    Fichiers attachés Fichiers attachés

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 125
    Par défaut
    Salut la commande que tu cherches est seekp()

    par contre peut etre peux tu eviter cette fonction.
    fais un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    vector<etudiant>  v;
    string buf;
    while(getline(f,buf))v.push_back(etudiant(buf));

  3. #3
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Utilises std::getline() pour lire les lignes (et pas std::istream::getline()), les vecteurs plutôt que de compter.
    Et ne fas pas de lecture sur eof().
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 5
    Par défaut
    merci pr vos réponses...
    mais, avec mon niveau, je n'arrive pas à comprendre vos indications... Luc, comment utiliser std::getline au lieu de std::fstream::getline()? on peut utiliser getline sans fstream?? et comment ca ne pas lire sur eof? je n'arrive pas à me repositionner au debut mme avec la commande seekg()

    encore merci

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::string machin;
    std::getline(std::cout,machin);

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 125
    Par défaut
    Ce qu'il te dit correspond au bout de code que je t ai donné

    Ton code demande de le faire en 2 passes , 1 tu comptes le nombre de lignes puis tu init un tableau et apres tu relis les lignes pour remplir ce tableau.

    on te propose d'utiliser un vector<> plutot q'un tableau
    tu peux utiliser le vecteur comme un tableau avec un index.
    et surtout tu geres pas la taille ce qui va te permettre de remplir ton vecteur de la premiere lecture du fichier .

    pour la doc sur le vecteur regardes cette faq ou bien les cours qui sont sur le meme site http://c.developpez.com/faq/cpp/?page=STL#STL_vector

    sinon testes le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ifstream fichier_entree("c:/donnee.txt");
    string line;
    while(getline(fichier_entree,line))cout << line << endl;
    Quand tu as fait ca il te faudra un moyen pour remplir ta structure a l'aide
    d'une string qui correspond a la ligne.

    pour le seekp() la commande doit etre de tete : fichier_entree.seekp(0);

    voila
    bonne chance et prends le temps de lire la faq et les cours

  7. #7
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    eof -> FAQ
    lecture de lignes dans un fichier -> FAQ


    Pour retourner au début du fichier après que tu aies atteint la fin ou provoquer une erreur, il faut réinitialiser les flags d'état du flux (avec un clear() je crois)
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 28/04/2010, 11h05
  2. Réponses: 11
    Dernier message: 13/10/2004, 00h58
  3. Problème de gestion fichiers
    Par glutock dans le forum ASP
    Réponses: 2
    Dernier message: 08/04/2004, 11h55
  4. Problème avec les fichiers .JPG
    Par cprogil dans le forum Langage
    Réponses: 5
    Dernier message: 10/06/2003, 15h44

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