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 :

parcouriri un fichier texte


Sujet :

C++

  1. #1
    Membre éclairé Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par défaut parcouriri un fichier texte
    Bonjour. Je m'y perds. J'ai un fichier qui contient des "tags". exemple:
    bla bla bla [TAG 1] bla bla
    bla [TAG 2] bla bla [TAG 3]
    bla bla
    bla [TAG 4] bla
    Je veux le parser et garder en mémoire les positions de ces tags (dans un vector<streampos>)
    Mais je suis un peu embêté car je ne maîtrise pas trop les ifstream, istringstream, strings, etc... et je ne sais pas trop comment m'y prendre de façon optimale. Mon idée est la suivante: Ecrire une fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    streampos GetNextTag(ifstream is, streampos offset);
    Je passe à cette fonction le fichier en question (mon ifstream), ainsi que la position du dernier tag trouvé.

    Dans cette fonction, je commence par positionner le "curseur" grâce à l'offest, avant de commencer ma recherche. Ainsi, lors du premier appel de la fonction, je trouve le premier tag, et à chaque appel successif, je passe en 2ème paramètre l'offset du dernier tag trouvé. Un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ifstream is;
    is.open(filename.c_str())
     
    streampos offset =0;
    while(is.eof() == false)
    {
      offset = GetNextTag(is,offset);
      vect.puch_back(offset);
    }
    Mon vecteur devrait contenir les offsets de chaque tags relativement au début du fichier.

    Mais la je rencontre 2 problèmes:
    1/ positionner le curseur ça marche pas. je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    streampos GetNextTag(ifstream is, streampos offset)
    {
      streampos nextTag;
      streampos cursor = is.tellg();    // pour affichage uniquement
      is.seekg(offset, ios_base::beg) // <-- c'est correct ça? ça marche pas
      cursor = is.tellg();
     
      /*... recherche du prochain tag ...*/
     
      return nextTag;
    }
    Lors du premier passage dans ma fonction, tout ce passe bien, je trouve l'offset du premier tag. Mais au deuxième appel, ça marche plus.
    au premier passage, j'ai mon cursor._Off = 0 avant le seekg, et aussi apres.
    au deuxième, j'ai -1 avant, et -1 apres (alors que offset vaut 3)

    2/ pour rechercher les tags dans le fichier, je passe par la classe string: J'ai un objet string que j'initialise en lisant une ligne, puis je recherche les tags dans ma string avec la finction find. Mais je suppose qu'il y a plus simple?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    char line[LINE_MAX_LENGTH];
    string str;
    /*...*/
    is.getline(line,LINE_MAX_LENGTH);
    str.assign(line);
    /*...*/
    temp = str.find(tags[i],0);
    /*...*/
    Est-ce qu'il y a pas plus simple? En plus la je mélange de strempos "position dans la string" et "position dans le fichier" et je sens que c'est pas bon

    Est-ce que quelqu'un a des propositions à me faire? j'ai volontairement mis que des "bouts de code" car la globalité de mon code est bien plus complexe, mais je pense que déja dans ce que je vous montre, il y a matière à me corriger. N'importe quelle autre proposition sera la bienvenue pour parvenir à stocker les positions de ces tags.

    Dernière chose: il faudrait pas utiliser des istringstream la dedans?

    MERCI!

  2. #2
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Par exemple:
    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
    #include <iostream>
    #include <sstream>
    #include <fstream>
    #include <iterator>
    #include <vector>
    #include <algorithm>
     
    using namespace std;
     
    template<typename T>
    std::ostream& operator<<(std::ostream& os,std::vector<T> v){
    	os<<"[";
    	std::copy(v.begin(),v.end()-1,ostream_iterator<T>(cout,","));
    	os<<v.back()<<"]";
    	return os;
    }
     
    int main(void){
    	ifstream file("");
    	stringstream ss;
    	string s;
     
    	ss<<file.rdbuf();
    	s=ss.str();
     
    	vector<ptrdiff_t> v;
     
    	string::iterator it0=s.begin(),it1=s.end(),it=s.begin();
     
    	while((it=find(it,it1,'['))!=it1){
    	v.push_back(it-it0);
    	it=find(it,it1,']');
    	}
     
            cout<<v<<endl;
    	system("pause");
    	return EXIT_SUCCESS;
    }

  3. #3
    Membre éclairé Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par défaut
    Hello.

    Merci pour ta proposition. Je ne la comprend pas très bien (j'ai de la peine notamment avec les templates, mais je me soigne) mais je vais m'y mettre et essayer de tout comprendre.

    Une précision toutefois s'il te plaît: quant du écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    /*...*/
    ifstream file("");
    stringstream ss;
    string s;
     
    ss<<file.rdbuf();
    s=ss.str();
    /*...*/
    Est-ce que ça correspond bien (comme je le comprends) à ouvrir un fichier texte, et stocker l'intégralité de son contenu dans une string?

    Parce que si c'est ça, j'ai bien peur que ça ne me convienne pas. Le but ultime est de parser un fichier texte qui fait 280 Mo. (eh oui je sais c'est complétement débile mais j'ai pas le choix) Et je pense que du coup, mettre le contenu dan sun string, ça prendra deux heures...

    Merci

  4. #4
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Pour les templates c'est juste pour l'affichage du "vector":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    copy(v.begin(),v.end(),ostream_iterator<int>(cout," "));
    le faisant de manière plus simple.

    Si le fichier est conséquent le parsing peut se faire en fractionnant le fichier.

  5. #5
    Membre éclairé Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par défaut
    d'avoir pris le temps de m'aider.

    Je n'ai actuellement pas du tout le temps d'essayer ta solution, je l'essayerai toutefois dans le courant de la semaine et reviendrai peut-etre avec quelques questions .

Discussions similaires

  1. [LG]rechercher dans un fichier texte
    Par BadFox dans le forum Langage
    Réponses: 11
    Dernier message: 01/12/2003, 15h57
  2. Réponses: 1
    Dernier message: 12/02/2003, 09h36
  3. [VB6] Ecrire/Modifier/Effacer ds un fichier text-4 Chs/Lg
    Par Jonathan_Korvitch dans le forum VB 6 et antérieur
    Réponses: 18
    Dernier message: 24/12/2002, 18h54
  4. Importer des fichiers textes délimités
    Par Invité dans le forum Outils
    Réponses: 2
    Dernier message: 23/09/2002, 13h56
  5. Instruction pour créer un fichier text ???
    Par Soulsurfer dans le forum Langage
    Réponses: 2
    Dernier message: 06/08/2002, 11h17

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