Ecriture de vector

Signaler
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
-
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
-
bonjour a tous,
je voudrais savoir comment ecrire un vector dans un fichier sur mon disque dur
de sorte que je puisse le recuperer et recreer le vector au demarage de mon programme en gros c'est un fichier de sauvegarde mais le probleme c'est que j'ai aucune idee de comment faire et je n'ai rien trouver sur le net

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"

12 réponses

Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
17
si possible vous pourriez faire votre reponse pour le c++ et non le c s'il vous plait
merci

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Messages postés
202
Date d'inscription
dimanche 18 mai 2003
Statut
Membre
Dernière intervention
6 mars 2010

Tu fais un bete fichier ou tu enregistre un à un tes valeurs.

Le code ci-dessous est a intégrer a ton code :



Vector vecteur;

fstream fichier( nomFichier , ios::in | ios::out | ios::binary );



// sauvegarde

for( int i = 0; i<vecteur.size() ; i++ )

fichier << vecteur[i] << " "; // 'l'espace est nécessaire pour distinguer 2 chiffres



// chargement

for( int i = 0; i<vecteur.size() ; i++ )


fichier >>vecteur[i];

Voili,Voilou
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
17
merci mais ca marche pas :
tout d'abord mon vecteur et un vecteur d'un type que g creer:
Produit(nom,reserve);
apres dans le fichier principal g creer un vecteur global :
vectorstock;
sur lequelje peut faire beaucoup d'action et l'action qui me manque et cele de l'enregistrement et de la recuperation donc voila les deuc fonction d'ecriture et de lecture et ca ne passe pas le stade de la compilation :
void save()
{
fstream fichier( "vector.dae" , ios::in | ios::out | ios::binary );


// sauvegarde
for( int i = 0; i<stock.size() ; i++ )
fichier << stock[i] << " ";


} ;
void lecture(){
fstream fichier( "vector.dae" , ios::in | ios::out | ios::binary );
for( int i = 0; i<stock.size() ; i++ )
fichier >>stock[i];
};
voici l'erreur retourne par dev-cpp:
no match for 'operator<<' in 'fichier << (&stock)->std::vector<_Tp, _Alloc>::operator[] [with _Tp = Produit, _Alloc = std::allocator](((unsigned int)i))'

si tu veut la source de l'obet produit demande
mais merci

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Messages postés
202
Date d'inscription
dimanche 18 mai 2003
Statut
Membre
Dernière intervention
6 mars 2010

Comme tu utilise un type non stantard --> "produit" tu dois d'abord
surcharger l'opérateur "<<" et ">>" de ta
classe produit.



exemple de surcharge.



class Produit

{

protected:

char* nom;

bool reserve;



public:

... // méthode de ta classe



friend ostream& operator << ( ostream o , const Produit& P )

{

return o << P.nom << " " << P.reserve;

}



friend istream& operator >> ( istream i , const Produit& P )

{

return i >> P.nom >> P.reserve;

}

};



Si tu n'y arrive pas envoie moi tes sources

Voili,Voilou
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
17
"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
17
adapter a mon code ca donne :
friend ostream& operator P.getName() >> P.getReserve();
}
}
mais je ne sais pas ou le placer :
voici mes source :
/////////////////////produit.h///////////////////////
#ifndef PRODUIT_H
#define PRODUIT_H
#include
#include
using namespace std;
class Produit
{
public:

//constructeur principal
Produit();
// le lire pour le creer
void read();
//imprimer
void print() const;
//recupere le nom
string getName()const;
//recupere les reserve restantes
int getReserve()const;
//modifie le champs reserve
void setReserve();
private:
string name;
double reserve;
};
#endif

///////////////////// fin produit.h///////////////////////

/////////////////////produit.cpp///////////////////////

#include
#include"produit.h"
using namespace std;
//construcreur
Produit::Produit()
{
name="unproduit";
reserve=1;
}
//nouveau objet
void Produit::read()
{
cout
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
17
"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
17
"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
17
ca fait 2 fois que ca deconne mais je voulais dire : ne soyez pas severe avec moi c ma premiere source c++

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Messages postés
202
Date d'inscription
dimanche 18 mai 2003
Statut
Membre
Dernière intervention
6 mars 2010

J'ai regarder vite fait et ça a l'air bon. mais tu peut utiliser
directement tes données privées au mieux de passer par une méthode. Je
crois que j'ai oublié de mettre des references pour ostream et istream
passer en parametre.



ça donne :



friend ostream& operator << ( ostream& o , const Produit& P )

{

return o << P.name << " " << P.reserve;

}

friend istream& operator >> ( istream& i , const Produit& P )

{

return i >> P.name >> P.reserve;

}



pour la gestion des fichiers elle se fait avec fstream.



ios::in ( normalement std::ios:in inutile car -> unsing namespace
std; ) permet d'ouvrir ton fichier en lecture. ios::out en ecriture et
créer si il n'existe de pas. ios::binary permet d'écrire autre chose
que tu texte ( attention probleme avec les opérateur << et
>> ).

il existe d'autre flags pour l'ouverture de fichier.



pour écrite et lire soit les opérateur << et >> soit la
fonction read et write. tu dois passer en parametre un pointeur de char
( donc char* ) et le nombre d'octet lu ou écrit.



et la méthode close pour fermer le fichier.



fstream fichier;



fichier.open( "nomFichier" , ios::in ); // lecture



if( fichier.is_open() == false )

return err; // le fichier n'est pas ouvert.



fichier << "ecrit";



char* chaine = "ecrit2";



fichier.write( chaine , 6 );



fichier.close(); // ferme le fichier

Voili,Voilou
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
17
d'accord et pour la lecture je lit en comptan le normbre d'octet que je veut en sachant qu'un octet = 1caracter mais comme je ne compte pas m'amuser a compter le nombre de caracter qui se trouve dans mon objet yaurai pas une fontion de la std qui le ferai ?

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
17
en regardant ton fstream je vois que tu ne la declare qu'en lecture tu est sur que dans ton cas write marchera ?
je vien d'essaye encore tes surcharge d'operateur mais elle ne marche pas:
voici les erreur que le compilo me retourne (dev-cpp):
main.cpp:15: error: can't initialize friend function `operator<<'
main.cpp:15: error: friend declaration not in class definition


main.cpp:19: error: can't initialize friend function `operator>>'
main.cpp:19: error: friend declaration not in class definition


main.cpp: In function `std::istream& operator>>(std::istream&, const Produit&)':
main.cpp:20: error: no match for 'operator>>' in 'i >> Produit::getName() const()'

=> g ecris ca dans main.cpp:

friend ostream& operator << ( ostream& o , const Produit& P )
{
return o << P.getName() << " " << P.getReserve();
}
friend istream& operator >> ( istream& i , const Produit& P )
{
return i >> P.getName() >> P.getReserve();
}

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"