Écrire et lire un objet de la classe dans et à partir d'un fichier binaire
J'essaie d'écrire et de lire un objet de la classe dans et à partir d'un fichier binaire en C++. Je veux pas écrire les données de ses membres individuellement, mais écrire la totalité de l'objet à la fois. Pour un exemple simple:
class MyClass {
public:
int i;
MyClass(int n) : i(n) {}
MyClass() {}
void read(ifstream *in) { in->read((char *) this, sizeof(MyClass)); }
void write(ofstream *out){ out->write((char *) this, sizeof(MyClass));}
};
int main(int argc, char * argv[]) {
ofstream out("/tmp/output");
ifstream in("/tmp/output");
MyClass mm(3);
cout<< mm.i << endl;
mm.write(&out);
MyClass mm2(2);
cout<< mm2.i << endl;
mm2.read(&in);
cout<< mm2.i << endl;
return 0;
}
Cependant, la sortie en cours d'exécution montrent que la valeur de mm.j'ai soi-disant écrite dans le fichier binaire n'est pas lu et attribué à mm2.j'ai correctement
$ ./main
3
2
2
Alors, quel est le problème avec elle?
Que dois-je être conscient de quand généralement de l'écriture ou de la lecture d'un objet d'une classe ou d'un fichier binaire?
OriginalL'auteur Tim | 2010-01-12
Vous devez vous connecter pour publier un commentaire.
Les données sont mises en mémoire tampon afin qu'il n'a pas atteint le fichier quand vous allez le lire. Depuis que vous avez à l'aide de deux objets différents pour faire référence à l'/sortie de fichier, le système d'exploitation n'a pas la moindre idée de comment ils sont liés.
Vous devez vider le fichier:
ou de fermer le fichier (qui n'implicite flush):
Vous pouvez également fermer le fichier en ayant l'objet hors de portée:
Oui, vous pouvez avoir un fichier de flux ouvert pour la lecture et l'écriture.
À mon avis, Yann Ramin la réponse est beaucoup plus utile. Il explique cette rinçage idée, et indique aussi la meilleure façon avec boost.
OriginalL'auteur R Samuel Klatchko
Dumping données brutes est une idée terrible, à partir de plusieurs angles. Cela permettra de briser, même pire une fois que vous ajoutez des données de pointeur.
Une suggestion serait d'utiliser Coup de pouce.La sérialisation qui permet pour beaucoup plus de données robuste dumping.
Votre principal problème est que le fichier ne contient pas le contenu mais en raison de fstream de mise en mémoire tampon. Fermer ou à vider le fichier.
OriginalL'auteur Yann Ramin
Je vais echo "vous ne devriez pas faire ça". Si vous imprimez
sizeof(myc)
dans le code ci-dessus, c'est probablement 4, comme vous le souhaitez... MAIS essayez de changer de lire et d'écrire pour être virtuel. Quand je l'ai fait, il imprime la taille 16. Ces 12 octets sont internes tripes avec des valeurs sensibles et de les enregistrer puis de les lire, de retour en serait comme s'attendent à une valeur de pointeur pour être toujours bon si vous l'avez écrit et l'a chargé de nouveau.Si vous voulez contourner la sérialisation et la carte C++ objet de la mémoire directement sur le disque, il y a des façons de pirater. Mais les règles sont impliqués et ce n'est pas pour les faibles de cœur. Voir POST++ (Objet Persistant de Stockage pour le C++) comme un exemple.
Je vais ajouter que vous n'avez pas coché la
fail()
oueof()
état. Si vous avez eu, vous auriez su que vous étiez une utilisation abusive de l'fstream API. Essayez de nouveau avec:...et de voir ce qui se passe.
OriginalL'auteur HostileFork
Mon C++ est assez à la rouille et très sous-testé, mais vous pouvez prendre un coup d'oeil à la Sérialisation et Unserialization. FAQ
OriginalL'auteur