salut tout le monde , c ma premiére participation avec vous a ce forum ,j'espere que je v passer un bon moment, ben ma question et la suivante:
comment remplir une liste chainé a partir d'un fichier txt ???
voila le programme que j realiser ,il consiste a remplir un fichier txt avec les comptes des adherant a une banque, ce compte et une structur composé par un id(numero du compte) ,nom , solde et la situation (debiteur oui/non)
le programme sauvegarde sur le fichier mais j'arrive po a trouver la procedure qui extrait du fichier(id, nom ,sold , debiteur(o/n)) j fait un essai mai j'arrive pas
AIDEZ MOI PLZ
merci d'avance
#include <conio.h>
#include <iostream>
#include<stdlib.h>
#include<fstream>
#include<string>
using namespace std;
typedef struct {
int id_cmpt;
string nom_proprietaire;
long sold;
char debiteur;
}compte;
typedef compte typeEle;
typedef struct bank liste;
struct bank{
typeEle compte;
liste* suiv;
};
liste* initialisation(){
return NULL;
}
bool estVide(liste* l){
return (l==NULL);
}
liste* ajout(liste* l,int id,string nom,long sld,char deb){
liste* b;
b=(liste*)malloc(sizeof(liste));
b->compte.id_cmpt=id;
b->compte.nom_proprietaire=nom;
b->compte.sold=sld;
b->compte.debiteur=deb;
b->suiv=l;
l=b;
return l;
}
void affiche(liste* l){
liste* par;
par=l;
while (par!=NULL){
cout<<"identifiant : "<<par->compte.id_cmpt<<" nom : "<<par->compte.nom_proprietaire<<" sold : "<<par->compte.sold<<" debiteur(true/false) : "<<par->compte.debiteur<<endl;
par=par->suiv;
}
}
liste* recherche(liste* l,int id){
liste* par;
par=l;
while ( (par!=NULL) && (par->compte.id_cmpt!=id) )
par=par->suiv;
return (par);
}
liste* suppression(liste *l,int id){
liste *parc;
liste *pred;
parc=l;
if(parc->compte.id_cmpt==id){
l=l->suiv;
free(parc);
}
else
while(parc!=NULL && parc->compte.id_cmpt!=id){
pred=parc;
parc=parc->suiv;
}
if(parc!=NULL){
pred->suiv=parc->suiv;
free(parc);
}
return (l);
}
void sauvegarde(liste* l){
liste* parc;
parc=l;
string nom_fichier("bank.txt");
fstream fichier(nom_fichier.c_str(),ios::out|ios::app);// ouverture en écriture avec conservation de toutes les données insérées dans fichier ouvert
if(fichier.fail())//si l'ouverture du flux a echouée
cerr<<"Erreur: impossible d ecrire dans le fichier "<<nom_fichier<<endl;
else{
while(!estVide(parc)){
fichier<<parc->compte.id_cmpt<<"|"<<parc->compte.nom_proprietaire<<"|"<<parc->compte.sold<<"|"<<parc->compte.debiteur<<";\n";
//getline;
parc=parc->suiv;
}
}
fichier.close();// on ferme le fichier
}
/*void loadList(){
string nom_fichier("bank.txt");
ofstream fichier(mon.c_str(),ios::in);
if(fichier.fail){*/
int main(){
int choix;
liste *tete,*res;
int id,idRech;
string nom;
char deb;
long sld;
tete=initialisation();
do{
cout<<" MENU"<<endl;
cout<<"1- ajouter un compte"<<endl;
cout<<"2- afficher la liste des comptes"<<endl;
cout<<"3- rechercher un client"<<endl;
cout<<"4- supprimer un client"<<endl;
cout<<"5- sauvegarder"<<endl;
cout<<"0- quitter"<<endl;
cout<<"donner votre choix"<<endl;
cin>>choix;
switch(choix){
case 1:{
cout<<"donner l'id du compte"<<endl;
cin>>id;
cout<<"donner le nom du proprietaire"<<endl;
cin>>nom;
cout<<"donner le solde du compte"<<endl;
cin>>sld;
cout<<"debiteur/ crediteur "<<endl;
cin>>deb;
tete=ajout(tete,id,nom,sld,deb);
}break;
case 2:{
affiche(tete);
}break;
case 3:{
cout<<"donnez l'identifiant du client a rechercher"<<endl;
cin>>idRech;
res=recherche(tete,idRech);
if(res==NULL)
cout<<"ce client ne possede pas de compte!!"<<endl;
else{
cout<<"le compte du client :"<<endl;
cout<<"nom : "<<res->compte.nom_proprietaire<<" solde : "<<res->compte.sold<<" debiteur(true/false) : "<<res->compte.debiteur<<endl;
}
}break;
case 4:{
cout<<"donnez l'identifiant du client a supprimer"<<endl;
cin>>idRech;
tete=suppression(tete,idRech);
}break;
case 5:{
sauvegarde(tete);
}break;
case 0:{
sauvegarde(tete);
exit(0);
}break;
}
}
while(choix!=0);
return(0);
}
Les listes chaînées sont surtout utilisées en C, puisqu'il existe des outils dans la <acronym title="Standard Template Library">STL</acronym> de C++ qui permettent de manipuler des listes et tableaux dynamiques.
(la différence majeure est le fait que les éléments de vector sont à un emplacement contigü en mémoire).
Concernant l'utilisation des listes chainées dans ton code, il suffit d'obtenir les données du fichier pour pouvoir appeler la méthode ajout. Ouvrir un fstream ou un ifstream et utiliser l'opérateur >> est un très bon moyen d'obtenir les données nécessaires. Rappelle-toi, tu dois lire les données dans le même ordre que tu les écris.
Salut,
Je constate que les gens commencent a avoir une tendence à donner des explications approximatives -_-
Bon, pour ton problème, le premier point est que ton typedef est completement inutile en c++, un struct induit directememnt un typedef réalisé par le compilo
secondo, ton
b=(liste*)malloc(sizeof(liste));
peut être remplacé par
b = new liste;
Et puisque nous sommes en c++, je me permets de te donner un conseil pour l'ajout et toutes modifications dans ta liste:
void ajout(liste*& tete, int val)//Utilise les références le plus possible, ça simplifie beaucoup le travail
//et c'est plus propre
{
liste* ele = new liste;
if(!ele)
{
exit(0);
}
//------------------------
//On réalise une insertion
//en tête de liste
//------------------------
ele->next = tete;
tete = ele;
ele->val = val;
}
Et la, au lieu de retourner la nouvelle tête de liste, tu peux utiliser le retour pour vérifier l'état de la fonction (1 allocation réussie, -1 erreur)
Voila, normalement comme ça, t'auras pas de problème
La maîtrise des fondamentaux est le fondamental de la Maîtrise.
Pas "peut être remplacé", mais "doit être remplacé". malloc est incompatible avec les types non POD: il n'appelle pas le constructeur, or la struct contient une string, elle est donc non POD.
Ap, désolé 1000 excuses
C'est vrai, malloc DOIT être remplacé par new, lmghs a donné l'explication qu'il faut
Merci lmghs
La maîtrise des fondamentaux est le fondamental de la Maîtrise.
remplir une liste chainé HELP
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
La maîtrise des fondamentaux est le fondamental de la Maîtrise.
La maîtrise des fondamentaux est le fondamental de la Maîtrise.