Changer le continu d'une ligne d'un fichier txt [Résolu]

Messages postés
5
Date d'inscription
dimanche 2 août 2009
Statut
Membre
Dernière intervention
8 août 2009
- - Dernière réponse : esprit1983
Messages postés
5
Date d'inscription
dimanche 2 août 2009
Statut
Membre
Dernière intervention
8 août 2009
- 8 août 2009 à 18:18
Salut,
J'ai réalisé cette classe matiere qui permet de:
-saisir un objet de type matiere qui contient un champ (nom) de type string
et un champ(cof) de type in puis ecrit cette objet dans le fichier matiere.txt tout ça est réaliser par la fonction ecrire()
-A l'aide de la fonction affiche(),afficher le contenu du fichier matiere.txt sur l'écran.
-A l'aide de la fonction rechercher(matier),chercher un matière dans le fichier matiere.txt
-A l'aide de la fonction ajouter(matiere), ajouter un matière dans le fichier matiere.txt si cette matière n'existe pas
Enfin voici le code de cette classe matiere
le .h
#include
#include<string>
#include <fstream>

using namespace std;
class matiere
{
string m_nom;
int m_cof;
public:
matiere():m_nom(" "),m_cof(0){} ;
matiere(string nom,int cof):m_nom(nom),m_cof(cof){};
friend istream &operator>>(istream &,matiere &);
friend ostream &operator<<(ostream &,matiere);
void ecrire();
bool rechercher();
void affiche();
void ajouter(matiere );
};


le .ccp

#include "matiere.h"
istream &operator>>(istream &in,matiere &mat)
{

in>>mat.m_nom;
    cout<<"\t";
in>>mat.m_cof;
return in;
}
ostream &operator<<(ostream &out, matiere mat)
{
out<<endl;
out<<mat.m_nom;
out<<"\t";
out<<mat.m_cof<<endl;
return out;
}

void matiere::ecrire()
{
ofstream fichier("../matier.txt",ios::app|fstream::out);
fichier<<*this;
fichier.close();
}

void matiere::affiche()
{
matiere mat;
ifstream fichier("../matier.txt",fstream::in);
string ligne ="";
while(!fichier.eof())
{ 
getline(fichier,ligne);
cout<<ligne;
cout<<endl;
}
fichier.close();
}
bool matiere::rechercher()
{
matiere mats;
bool existe = false;
ifstream fichier("../matier.txt",ios::app);
string ligne;
while(getline( fichier, ligne))
{
fichier>>mats;
if(m_nom==mats.m_nom)
existe=true;
}
return existe;
}

void matiere::ajouter(matiere mat)
{
if(!mat.rechercher())
{
ofstream fichier("../matier.txt",ios_base::app|ios::out);
    fichier<<mat;
    fichier.close();
}
else
cout<<"existe";
}




Il me reste une fonction qui permet de modifier une ligne de fichier matiere.txt par un objet matiere(nom,cof)passer en paramétre.
Merci d'avance pour votre aide .
Je suis débutant en c++ alors S.V.P si vous me donnez un solution veillez m'expliquer bien les choses .
Merci.
Afficher la suite 

4 réponses

Meilleure réponse
Messages postés
5
Date d'inscription
dimanche 2 août 2009
Statut
Membre
Dernière intervention
8 août 2009
3
Merci
merci pour tous

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 202 internautes nous ont dit merci ce mois-ci

Commenter la réponse de esprit1983
Messages postés
118
Date d'inscription
mercredi 24 décembre 2003
Statut
Membre
Dernière intervention
11 décembre 2011
0
Merci
Voila une solution yen a d'autre surement , la je passe part un autre fichier:


ifstream fichier("../matier.txt",fstream::in);
ofstream fichier2("../matier_tmp.txt",fstream::out);
string ligne ="";

while(!fichier.eof())

{
getline(fichier,ligne);

if (ligne=="lignre2")
fichier2<<"TONTRUC";
else
fichier2<<ligne+;

cout<<ligne;
cout<<endl;
}

fichier.close();
fichier2.close();

remove("../matier.txt");
rename("../matier_tmp.txt","../matier.txt");


Ciao
Commenter la réponse de cs_TeniX
Messages postés
5
Date d'inscription
dimanche 2 août 2009
Statut
Membre
Dernière intervention
8 août 2009
0
Merci
Merci TeniX.
J'ai adapté votre solution à mes besoins donc j'ai écrit cette fonction
void matiere::changer(matiere mte)
{
    ifstream fichier("../matier.txt",fstream::in);
    ofstream fichier2("../matier_tmp.txt",fstream::out);
    string ligne ="";
    matiere m;
    while(!fichier.eof())
     {
       fichier>>m;
       if(m.m_nom==(*this).m_nom)
        fichier2<<mte;
       else 
fichier2<<m;
}

   fichier.close();
   fichier2.close();
   remove("../matier.txt");
   rename("../matier_tmp.txt","../matier.txt"); 
}

Reste un petit problème la dernière ligne est écrit 2fois dans le fichier.
Merci.
Commenter la réponse de esprit1983
Messages postés
5
Date d'inscription
dimanche 2 août 2009
Statut
Membre
Dernière intervention
8 août 2009
0
Merci
problème résolu
void matiere::changer(matiere mte)
{
ifstream fichier("../matier.txt",fstream::in);
ofstream fichier2("../matier_tmp.txt",fstream::out);
    matiere m,ms,mss;
    while(!fichier.eof())
{
 fichier>>m;
 if((m.m_nom==(*this).m_nom)&&(mte.m_nom!=ms.m_nom))
 {
 fichier2<<mte;
 ms=mte;
 }
 else if((m.m_nom!=mss.m_nom)&&(m.m_nom!=(*this).m_nom))
 {
 fichier2<<m;
 mss=m;
 }
}
   fichier.close();
   fichier2.close();
   remove("../matier.txt");
   rename("../matier_tmp.txt","../matier.txt"); 
}
Commenter la réponse de esprit1983