Se placer dans un fichier txt (c++)

Résolu/Fermé
Sage - 18 juin 2012 à 06:12
 Sage - 18 juin 2012 à 14:39
Bonjour,



Le but de mon programme est de parcourir un fichier .cpp et de n'afficher que les entêtes des fonctions de la page.

Pour ce faire, je déclare une variable i qui s'incrémente a chaque ouverture de "{", et se décrémente à chaque fermeture de "}". Lorsque le i est à 0, la fonction sera alors terminée.


la fonction est la suivante :

if(chaine1 == "{")
{
i++;
if(i==1)
{

}


}
if(chaine1 == "}")
{
i--;

}
}


Je souhaiterais que, lorsque i==1, je me position sur la ligne du dessus afin de la récupéré et de l'afficher.

Admettons la fonction suivante :

void ajouter()
{ //i=1
if(...)
{ //i=2
} // i=1
} // i = 0



Sur la fonction je récupérerais donc :
void ajouter()


Une idée?
D'avance, merci.
A voir également:

5 réponses

Utilisateur anonyme
18 juin 2012 à 08:43
Bonjour

J'ai peur que ce ne soit pas si simple.
Quelques remarques :
Pourquoi revenir à la ligne précédente ? Il suffit de la mémoriser chaque fois pour ne pas avoir besoin de revenir en arrière.
Ça ne va pas marcher si on laisse une ligne vide entre la fonction et l'accolade, ou si la fonction est trop longue pour tenir sur une seule ligne, ou si comme moi on met l'accolade sur la même ligne que la fonction.
Mais surtout, ça ne va pas marcher dès qu'on utilise les accolades autrement que pour délimiter des blocs. Par exemple si écris x= "{"; cela n'ouvre aucun bloc, mais tu vas quand même le compter. Et il peut y avoir des { et des } dans les commentaires aussi.
1
Oui je le sais bien, ce n'est pas une application générique mais pour moi même. Donc pas de problème avec les accolades et mes fonctions tiennent sur une ligne.

Qu'entends-tu par mémoriser la ligne?
Le problème est que je stop ma recherche arrivé à "{". et je n'ai aucun moyen de stoper sur ma fonction... Rien ne me permet de m'arreter sur cette ligne..

Merci pour ta réponse.
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
18 juin 2012 à 09:32
Salut.
Les arguments du père sont fondés, mais c'est vrai que dans un premier temps on peut les oublié.
Ce que je ferais à ta place :
Lire le fichier et stocker les lignes dans un string. En prenant soin de ne pas mettre dedans les directive de préprocesseur (ligne commançant par '#'), les lignes vides et les commentaires. Ensuite, tu parcours ta variable et tu repères toutes les positions de début de bloc que tu stockes dans un vecteur. Pour finir, tu reprends ce vecteur et tu fait une recherches arrière avec pour caractère soit ';' soit '}'. Tu aura donc deux groupes de positions qui devraient te permettre de sortir ensuite justes les entêtes de fonctions.
0
Utilisateur anonyme
18 juin 2012 à 09:42
Si c'est pour toi même, alors la mémorisation de la ligne devrait suffire.
Ça consiste simplement à enregistrer la ligne dans une autre variable avant de lire la ligne suivante. Comme ça tu as toujours (sauf pour la 1ère ligne...) deux lignes disponibles dans ton programme : la ligne courante et la ligne précédente.

Tu peux enregistrer la ligne précédente avec une instruction du genre :
char ligneprecedente[200];
...
strncpy(ligneprecedente, lignecourante,sizeof(ligneprecedente));
// ensuite lecture de la ligne suivante -> lignecourante


Au passage, je ne crois pas que
chaine1 == "{"
marche.
Si chaine1 est un char, c'est chaine1 == '{'
si chaine1 est un char[], c'est strcmp(chaine1,"}")
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Tout d'abord, merci pour vos réponses.

Voici la solution que je propose, certe moins optimal, mais qui fonctionne :)

fstream fichier(filename.c_str(), ios::in | ios::out); //parcours du fichier
if(fichier)
{ int i=0, j=0, k=0;
while(!fichier.eof() ) //tant que la fin n'est pas atteinte
{
string chaine1;
fichier>>chaine1;

if(chaine1=="using") //ce if sert a commencer apres le "using" de using namespace std; (dont je me sert tout le temps)
{
delimiterHead=1; //Elle met le delimiter à 1
}

if(delimiterHead==1) //lorsque le délimiteur est à 1
{
if(chaine1 == "{") //comptage
{
i++;
}
if(chaine1 == "}") /décomptage
{
i--;

}

if(i==0) //si i==0 (fin de fonction)
{
getline(fichier, ligne); //On récupère le ligne
if(ligne != "" && ligne != " namespace std;") //Suppression des lignes vides et du " namespace std;"
{
tableFonction[k] = ligne; // un tableau qui stock les entête de fonctions
cout<<tableFonction[k]<<"\n";//affichage de l'entête
k++;
}
}


} j++;
} //fin while


Etonnemment, le "{" et "}" fonctionne.. Mais bon je ne m'en plains pas :)

Merci pour votre aide, je garde vos conseil qui me seront surement utile.
0