Changer le continu d'une ligne d'un fichier txt

Résolu
esprit1983 Messages postés 5 Date d'inscription dimanche 2 août 2009 Statut Membre Dernière intervention 8 août 2009 - 2 août 2009 à 12:08
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.

4 réponses

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
merci pour tous
3
cs_TeniX Messages postés 118 Date d'inscription mercredi 24 décembre 2003 Statut Membre Dernière intervention 11 décembre 2011 2
2 août 2009 à 21:51
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
0
esprit1983 Messages postés 5 Date d'inscription dimanche 2 août 2009 Statut Membre Dernière intervention 8 août 2009
3 août 2009 à 02:29
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.
0
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:17
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"); 
}
0
Rejoignez-nous