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
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:
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:
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?
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!
Partager