C++lire un fichier string dans un tableau ...

Résolu/Fermé
philipal - 14 avril 2009 à 00:33
 philipal - 16 avril 2009 à 18:59
slt a tous,

Voila mon probleme j'ai un travail a rendre en c++. c'est un travail assez consequant dans lequel il faut gérer plusieurs classes avec des menus et sous menus. J'ai créé une classe "salles" qui me permet d'ajouter les nom de salles dans un fichier string. je voudrai maitenant pouvoir supprimer une ligne de se fichier. Ligne que l'utilisateur aurait lui meme taper en réponse a la question "quel ligne voulez-vous effacée?"

Le prof m'a dit que la meilleur solution qd on gere des string est de: 1. lire le fichier ligne par ligne, 2. taper le tt dans un tableau de string ( dynamique de préférence), 3. effacer la ligne désirée et enfin réécrire le contenu du tableau dans le fichier.

je cherche sur le net depui 15 jours pour trouver des codes qui pourrai m'aider ou des sites reprenant les fonctions membre de la libréries string. Rien, enfin si mais ses sites ne sont pas complets ou trop complex et les mec dans les forum disent quoi faire mais pas une trace de code a titre d'exemple. Y a aussi que je suis un débutant et donc si on me montre le prototype d'une fonction je sais pas l'écrire sans faute il me faut absolument du code bien claire avec commentaire pour que je puisse comprendre.

Enfin voici ma fonction "supprimer" faisant partie de la classe "salles" ce que je veux faire est assez explicite je crois avec les commentaire:

void salles::suppr(string nom,string batiment,string ligne,int b)
{
fstream fichier("salles.txt", ios::out | ios::in | ios::ate); // On ouvre le ficher en lecture-écriture

if(fichier) // si l'ouverture a réussie
{
string nom;
string batiment;
string ligne;
// il fo initialiser un tablau dynamique de string (je sais pas comment on fait)
int b;
b=0;
while(getline(fichier, ligne)) // tant que l'on peut mettre une ligne du fichier dans "ligne"
{
//on la charge dans un tableau
}
cout << "Veuillez entrer la ligne a effacer:" << "\n" << endl;
cin >> b ; // l'utilisateur saisi un numéro de ligne qu'il veut éffacer
// fonction membre string pour éffacer la ligne saisie
// on réécri le reste du tableau dans le fichier

fichier.close();
}
else // sinon
{
cerr << "Erreur à l'ouverture !" << endl;
}

}


s'il vous plait aider moi je ne sais plus coi faire, je suis completement démoralisé
A voir également:

27 réponses

c bon g trouver qqun de sympas sur un autre forum qui a montré une fonction pour supprimer une ligne dans un vector

voici donc ma fonction supprimer, déstiner a tt ceux qui comme moi galere en c++ et ce font agresser par des programmeurs qui on oublier ce que c que d'apprendre

et ceux qui aime pas les fautes d'orthographe dans les forum, nos message ne sont pas des rédaction destiner au ministres j'estime donc que si les gens veulent ecrire en phonetique dans un forum pour aller plus vite c leur droit. en plus on est des programeur pas des prof de français

void salles::suppr(string ligne,int i)
{
vector<string> v;
//lecture du fichier et mise des lignes dans le vecteur
ifstream fichier("salles.txt", ios::in);
if(fichier)
{
string ligne;
int i;
while(getline(fichier, ligne))
{
v.push_back(ligne);
}
fichier.close();
}
else // sinon
{
cerr << "Erreur à l'ouverture !" << endl;
}

//suppression d'une ligne au choix de l'utilisateur
cout << "Veuillez indiquer la ligne que vous voulez effacer:" << "\n" << endl;
cin >> i;
v.erase(v.begin() + i);<------voici la fonction la plus improtante sans elle vous effacer rien du tout

//ecriture du vecteur dans le fichier
ofstream file("salles.txt", ios::out);
if(file)
{
size_t n = v.size();
for(size_t i=0;i<n;++i) file << v[i] << std::endl;
}
else
{
cerr << "Erreur à l'ouverture !" << endl;
}
}

et pour terminer voici le site sur lequelle g trouver la fonction miracle merci a lui:
https://openclassrooms.com/forum/sujet/supprimer-des-cases-d-un-std-vector-23504

slt a tous
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
15 avril 2009 à 16:50
La fonction miracle tu l'a déjà au message 1 : "liste_str.erase(liste_str.begin()+nb_ligne_suppr); "
Si tu va voir ailleurs, tant mieux, marre de s'échiner pour du vent.
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
15 avril 2009 à 16:46
J'ai l'impression de parler dans le vide.
A quoi te sert ton putain d'argument ligne ? ???? non seulement tu ne l'utilise pas, mais en plus tu entre en conflit plus loin ! (4ème fois que je le répète)
Sort moi cette putain de merde liste de la porté du if !! comment veux tu t'en servir autrement (3ème fois que je le répète)
Utilise les balise de code pour mettre le C++ (3ème fois que je le répète).
"cin >> ; //je sais pas ce que je dois mettre comme variable; "
On s'en fout, mets ce que tu veux.
"//je sais pas comment on supprime avec les vector; "
Mamiemando a déjà donné la solution.
Je crois que je ne vais plus répondre tant que tu n'aura pas pris en compte tout ça.
0
he o du calm

vous etes tellement compliquer que j'avais rien compris et g pas fait attention a la fonction

pour l'argument ligne tu as raison i sert a rien lol

je sais que il fo bcp de patience ac les gens qui débute mais c pas une raison pour devnir injurieux
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
15 avril 2009 à 19:35
Un peu de calme tout les deux, ou je sévis.

Philipal, je te propose de regarder à tête reposée la solution que je t'ai proposé. Si certains points t'échappent, n'hésite pas à me le dire et j'essaierai de détailler. Je précise que dans mes réponses tu as environ 95% du code final que tu cherches à écrire (et les 5% restants sont triviaux à écrire).

Ce que tu dois retenir, c'est que ton programme est très simple à écrire si tu es familier de la STL. Comme tu sembles découvrir les différentes classes (std::ifstream, std::ofstream, std::list, std::vector....) la première étape est de te familiariser avec. Tu peux en particulier retrouver les méthodes disponibles pour chacune de ces classes ici :
https://community.hpe.com/t5/custom/page/page-id/HPPSocialUserSignonPage?redirectreason=permissiondenied&referer=https%3A%2F%2Fcommunity.hpe.com%2Ft5%2FServers-Systems-The-Right%2FSGI-com-Tech-Archive-Resources-now-retired%2Fba-p%2F6992583

Char Sniper, le mieux serait de laisser le temps à Philipal pour qu'il intègre ce qu'on lui a expliqué. La STL n'est pas forcément simple à appréhender, il est donc normal qu'il soit un peu perdu. Je compte sur toi pour faire preuve de patience par la suite. Pour apporter une aide efficace, il faut non seulement être clair/compétent/pédagogue, mais aussi et surtout patient et diplomate.

Bonne continuation à tout les deux.
0
Au départ je ne pensais pas que quelqu'un viendrait s'emmerder à venir aider un débutant. C'est pourquoi je vous demande d'accepter mes excuses sur ce que j'ai dit un peu plus haut (à propos de l'orthographe etc).

Mamiemando, comme tu as put le remarquer ma fonction suppression fonctionne maintenant. Je suis très content et t'en remercie. Je remercie aussi Char Sniper pour son aide.

Je me suis en effet grandement inspiré de ton code, mamiemando mais je l'ai un peu remanier à ma façon. C'est à dire que j'ai beaucoup appris sur le site du zéro et je trouve leur manière de coder très facile à comprendre.Enfin comme un exemple vaut mieux qu'une explication, tu peux voir le résultat final de ma fonction sur un de mes messages un peu plus haut.

Je dois vous avouer qu'après pratiquement 15 jours de recherche et de galères ça fait du bien d'avoir quelque chose qui fonctionne. Mais le programme est loin d'être fini.

Encore merci a vous deux.

Bien cordialement,

philipal
0

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

Posez votre question
j'ai enfin compris ce que tu voulais dire Char Sniper à propos du string ligne

dans le site du zéros il font ça ou alors j'ai rêvé et c'est une mauvaise habitude que j'ai prise désolé.
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
16 avril 2009 à 08:32
Salut.
à l'avenir, je t'encourage à poser des questions si tu ne comprends pas. Je suis bien consciens qu'un débutant ne comprenne pas certain termes ou certaines idées, et je suis tout à fait prêts à entrer dans les détails si tu me le demande. Je considère que si tu ne pose pas de question sur une intervention, c'est que tu en as compris chaque idée, chaque mot.
a+
0
philipal > Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023
16 avril 2009 à 18:59
ok Char Sniper
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
15 avril 2009 à 23:44
Au départ je ne pensais pas que quelqu'un viendrait s'emmerder à venir aider un débutant.

Pour moi char sniper n'aurait pas dû répondre si ça l'emmerdait. Car ça ne te permet pas d'avancer et c'est le principal objectif du fil de discussion.

En contrepartie, il ne faut pas que tu perdes de vue que les contributeurs du forum CCM passent leur temps libre à aider gratuitement les personnes qui postent sur CCM. C'est donc la moindre des choses de prendre le temps de comprendre et de lire ce qu'ils écrivent, car tout le temps qu'ils te consacrent, c'est du temps qu'ils ne consacrent pas aux autres.

Cependant je ne te jette pas spécialement la pierre. Le C++ n'est pas forcément simple à appréhender donc il faut prendre le temps de s'en imprégner.

Je me suis en effet grandement inspiré de ton code, mamiemando mais je l'ai un peu remanier à ma façon.

Pas de problème c'est fait pour. J'ai écrit quelque chose qui me paraît bien codé mais je conçois tout à fait que tu veuilles arranger le code à ton idée si ça correspond plus à ton besoin ou que ça te permet de mieux le comprendre. Attention toutefois à ne pas faire des modifications qui engendrent une diminution des performances, la manière dont je l'ai écrit ne sort pas du chapeau ;-)

C'est à dire que j'ai beaucoup appris sur le site du zéro et je trouve leur manière de coder très facile à comprendre.

Tout à fait c'est un excellent site pour démarrer. Toutefois la vocation du site du zéro, c'est de permettre de démarrer aux débutants en leur donnant un excellent aperçu d'une technologie. Dès que tu devras aborder des notions plus pointues, il faudra sans doute te référer à d'autres sources.

dans le site du zéros il font ça ou alors j'ai rêvé et c'est une mauvaise habitude que j'ai prise désolé.

En fait la seule chose importante c'est que tu comprennes parfaitement ce que tu écris (ou ce qu'on a pu écrire dans les codes que char sniper et moi-même t'avons proposé). C'est ce qui te permettra de progresser et d'appréhender pleinement ce langage.

Ainsi, si certains points de code sont encore un peu obscurs, n'hésite pas à poser des questions. Je t'invite également à prendre le temps de lire le lien que je t'ai donné auparavant sur la STL.
http://www.commentcamarche.net/faq/sujet 11255 introduction a la stl en c standard template library#les iterators

C'est un tutoriel que j'ai pris le temps d'écrire pour les gens qui comme toi découvrent la STL. On y aborde les différents containers de la STL, leurs avantages et inconvénient et comment les manipuler.

Ce que tu dois conserver à l'esprit, c'est que les performances d'un programme découlent de sa complexité (au sens complexité algorithmique, par exemple O(n) pour un algorithme qui croit en temps linéaire). Un programme est d'autant plus performant que sa complexité est faible (comprendre : plus la complexité est faible, moins l'ordinateur à de calculs à effectuer pour trouver le résultat).

Par exemple dans un std::vector, l'accès à la nième case est en O(1) (accès immédiat), alors que dans une liste, il est en O(n) (car il faut parcourir n éléments avant d'y accéder). Ainsi un vector est plus efficace à l'accès. Pour supprimer une case ou un maillon, dans un vector il faut décaler toute les cases qui suivent (complexité en O(n)), alors que dans un liste, il faut juste corriger le maillage de la liste (complexité O(1) si on connaît la position du maillon en question).

Si ces notions sont un peu obscures pour toi je t'invite vivement à lire :
https://fr.wikipedia.org/wiki/Complexit%C3%A9_algorithmique

Ainsi dans ton cas les deux approches sont a peu près équivalentes (O(n) dans les deux cas). L'avantage de la liste, c'est qu'en mémoire ce n'est pas un espace continue contrairement à un vector. Or il est plus difficile de de disposer d'un bloc de 1 000 000 éléments placés les uns à la suite des autres qu'un peu partout en mémoire. C'est pour cette raison que je te disais que si les fichiers ne sont pas trop gros on peut s'en sortir avec des vectors, mais sinon il est préférable d'utiliser des lists.

En espérant que tout ceci est plus clair pour toi,
Bonne chance
0
super tes conseils et les précieux liens que tu m'as filer. Je ne manquerai pas de les lire

tu m'as dit qu'un programme était d'autant plus optimisé qu'il était facile à comprendre; très bien je suis d'accord mieux on le comprend, plus il vas vite. Mais quand tu mes: des "size(n)...ou [++j] et des bazars pareil, pour réécrire dans le fichier par exemple, je trouve ça complexe à comprendre. Mais je débute aussi je suis sûr quand allant voir tes liens je finirai par comprendre et à trouver cela logique

a+
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
16 avril 2009 à 10:17
Tu m'as dit qu'un programme était d'autant plus optimisé qu'il était facile à comprendre; très bien je suis d'accord mieux on le comprend, plus il vas vite.

Non ce n'est pas ce que j'ai dit du tout. J'ai parlé de complexité algorithmique, si tu regardes le lien que je t'ai donné tu verras que ce n'est pas ça.

Mais quand tu mes: des "size(n)...ou [++j] et des bazars pareil, pour réécrire dans le fichier par exemple, je trouve ça complexe à comprendre.

Si tu regardes la doc de la STL tu verras que la méthode size() appliquée à un vector n'a rien de sorcier... ça récupère juste le nombre d'éléments :
https://community.hpe.com/t5/custom/page/page-id/HPPSocialUserSignonPage?redirectreason=permissiondenied&referer=https%3A%2F%2Fcommunity.hpe.com%2Ft5%2FServers-Systems-The-Right%2FSGI-com-Tech-Archive-Resources-now-retired%2Fba-p%2F6992583

L'opération ++j ne sert qu'à incrémenter j, en d'autres termes ça fait "j = j +1".

Mais je débute aussi je suis sûr quand allant voir tes liens je finirai par comprendre et à trouver cela logique

Je te le souhaite, d'autant plus que char sniper semble lui aussi prêt à t'aider ;-) Mais dans l'immédiat prends le temps de lire les liens que je t'ai indiqué, c'est à mon avis la prochaine étape pour que tu puisses progresser.
0