Bonjour. Je m'y perds. J'ai un fichier qui contient des "tags". exemple:
Je veux le parser et garder en mémoire les positions de ces tags (dans un vector<streampos>)bla bla bla [TAG 1] bla bla
bla [TAG 2] bla bla [TAG 3]
bla bla
bla [TAG 4] bla
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
Je passe à cette fonction le fichier en question (mon ifstream), ainsi que la position du dernier tag trouvé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part streampos GetNextTag(ifstream is, streampos offset);
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:
Mon vecteur devrait contenir les offsets de chaque tags relativement au début du fichier.
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); }
Mais la je rencontre 2 problèmes:
1/ positionner le curseur ça marche pas. je fais:
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.
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; }
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?
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
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 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!
Partager