Se placer dans un fichier txt (c++)
Résolu/Fermé
A voir également:
- Se placer dans un fichier txt (c++)
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Ouvrir un fichier .bin - Guide
- Comment ouvrir un fichier docx ? - Guide
5 réponses
Utilisateur anonyme
18 juin 2012 à 08:43
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.
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.
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.
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.
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
18 juin 2012 à 09:32
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.
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.
Utilisateur anonyme
18 juin 2012 à 09:42
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 :
Au passage, je ne crois pas que
Si chaine1 est un char, c'est chaine1 == '{'
si chaine1 est un char[], c'est strcmp(chaine1,"}")
Ç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,"}")
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.
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.