2009-02-27 3 views
7

Comment écrire le contenu d'une structure en C++ dans un fichier texte? Ce que je veux faire est, disons que j'ai une structure appelée A, avec les membres de données A.one, A.two, et ainsi de suite, et je veux les écrire ligne par ligne dans un fichier texte, commeDécharger des structures C++ dans un fichier texte

Structure A
A.one = valeur
a.deux = valeur ...

Structure B
B.one = valeur
B.two = valeur

Fondamentalement, je veux faire une décharge .. Y at-il un moyen facile de le faire? Quelle est la meilleure méthode d'E/S pour cela? CFile? iostream? Merci .. Existe-t-il un moyen plus facile de vider toutes les valeurs des données de membre d'une classe?


EDIT: Merde, merci les gars ..

+0

connexes: * [http://stackoverflow.com/questions/234724/how-to-serialize-in-c](http://stackoverflow.com/questions/234724/how-to -serialize-in-c) * [http://stackoverflow.com/questions/523872/how-do-you-serialize-an-object-in-c](http://stackoverflow.com/questions/523872/how-do-you-serialize-an-object-in-c) – dmckee

Répondre

8

Aucune réflexion en C++, donc vous devez le faire manuellement, par exemple (en utilisant iostream, pour simplicty):

dump_A(std::cout, "A", a); 

void dump_A(std::iostream& os, const char* name, A const& a) 
{ 
    os << "Structure " << name << '\n' 
     << name << ".one = " << a.one << '\n' 
     << name << ".two = " << a.two << '\n'; 
} 
5

C++ n'est pas introspective. Autrement dit, il ne sait rien sur le contenu de ses structures. Vous devez utiliser une sorte d'annotation manuelle ou un système de réflexion pour le faire.

Bien sûr, si vous êtes d'accord avec les informations de codage en dur sur les structures, vous pouvez vider les informations avec n'importe quelle méthode d'E/S.

Par exemple:

struct A 
{ 
    int member1; 
    char member2; 
}; 

void PrintA (const A& a) 
{ 
    std::printf ("member1: %d\n", a.member1); 
    std::printf ("member2: %c\n", b.member2); 
} 

Comme vous pouvez le voir c'est fastidieux, car il nécessite une connaissance intime de la structure, et ne sera pas automatiquement mis à jour si la structure est modifiée. Mais les frais généraux d'un système de réflexion pour le faire "correctement" peuvent être un inconvénient, surtout si vous apprenez.

+0

Peut-être que l'utilisation des classes d'E/S standarts C++ serait plus sûre ici? Si les types de membre1 et membre2 seront modifiés, votre code ne fonctionnera pas correctement. – okutane

+0

Je n'utilise pas le flux C++ IO de préférence. Vous avez raison de dire que ce serait un peu plus sûr dans ce cas, mais le fait est que le code requiert une mise à jour minutieuse pour rester cohérent avec la définition de struct, ce qui est vrai quel que soit le schéma d'E/S que vous préférez. –

0

Cela vaut plus à C que C++, mais gardez à l'esprit que si vous écrivez une structure directement dans un fichier (ou un tampon réseau), le résultat dépendra de la machine et du compilateur. Les entiers seront écrits dans l'ordre des octets de l'hôte et les octets de remplissage du compilateur pour la structure seront également inclus. Tenter de lire le tampon sur une machine avec différentes directives d'endianness ou de compilateur ne fonctionnera pas

Cela se produirait avec quelque chose comme (pardonner sur la syntaxe): write (f, & A, sizeof (A));

0

SI c'est juste un struct, une plaine ancien type de données C compatible avec NO méthodes virtuelles et NO pointeurs, puis comme une bidouille à court terme vous pouvez simplement utiliser:

struct Foo { int a, b; char c, d, e[50]; } f; 
write(fd, & f, sizeof(f)); 

Cependant, ne vous attendez pas à ce que ce soit une multiplicité de plates-formes, ou même des révisions de compilation croisée sur la même plate-forme.

I think I've discussed this before...

+0

que signifie le fd dans write (fd, ....)? est-ce le handle de fichier? il y a des pointeurs dessus .. =/ – krebstar

+0

fd == descripteur de fichier, obtenu à partir de open(). Si vous utilisez un fichier * (de fopen), vous pouvez utiliser fwrite(). –