2009-02-27 9 views
7

Wie würde man den Inhalt einer Struktur in C++ in eine Textdatei schreiben? Ich möchte sagen, ich habe eine Struktur namens A mit Datenelementen A.one, A.zwei und so weiter, und ich möchte sie zeilenweise in eine Textdatei schreiben, soDumping C++ - Strukturen in eine Textdatei

Struktur A
A.one = Wert
a.zwei = Wert ...

Struktur B
B.one = Wert
B.two = Wert

Grundsätzlich ich machen möchte ein Dump .. Gibt es einen einfachen Weg, dies zu tun? Was ist die beste E/A-Methode dafür? CFile? Iostream? Danke .. Gibt es eine einfachere Möglichkeit, alle Werte von Mitgliedsdaten einer Klasse zu verwerfen?


EDIT: Mist, Danke Jungs ..

+0

Verwandte: * [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-Sie-serialisieren-ein-Objekt-in-c) – dmckee

Antwort

8

Keine Reflektion in C++, so dass Sie es manuell tun, zB (Iostream Verwendung für 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++ ist nicht gekehrt. Das heißt, es weiß nichts über den Inhalt seiner Strukturen. Sie müssen dazu eine manuelle Annotation oder ein Reflexionssystem verwenden.

Natürlich, wenn Sie mit Hardcoding Informationen über die Strukturen in Ordnung sind, können Sie die Informationen mit jeder E/A-Methode ausgeben.

Zum Beispiel:

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); 
} 

Wie Sie sehen, diese mühsam, weil es genaue Kenntnis der Struktur erfordert, und wird nicht automatisch aktualisiert werden, wenn die Struktur geändert wird. Aber der Overhead eines Reflexionssystems, um dies "richtig" zu tun, kann ein Nachteil sein, besonders wenn Sie lernen.

+0

Vielleicht wäre die Verwendung von C++ - Standard-I/O-Klassen hier sicherer? Wenn die Typen von member1 und member2 geändert werden, funktioniert Ihr Code nicht korrekt. – okutane

+0

Ich verwende nicht C++ Stream IO als Vorzug. Sie haben Recht, dass es in diesem Fall geringfügig sicherer wäre, aber der Punkt ist, dass der Code eine sorgfältige Aktualisierung erfordert, um im Gleichschritt mit der Strukturdefinition zu bleiben, was unabhängig davon, welches IO-Schema Sie bevorzugen. –

0

Diese mehr C gilt als C++, aber bedenken Sie, dass, wenn Sie schreiben Sie eine Struktur direkt in die Datei (oder einen Netzwerkpuffer), dann wird das Ergebnis maschinen- und kompilerabhängig sein. Ganzzahlen werden in Host-Byte-Reihenfolge geschrieben und Compiler-Füllbytes für die Struktur werden ebenfalls enthalten sein. Der Versuch, den Puffer auf einer Maschine mit verschiedenen Endianess oder anderen Compiler-Direktiven zu lesen, funktioniert nicht

Dies geschah mit etwas wie (verzeihend auf Syntax): write (f, & A, sizeof (A));

0

IF dies nur ein struct ist, ein guter alter C-kompatibeler Datentyp, mit keine virtuellen Methoden und keine Zeiger, dann als Flickschusterei kurzfristige Sie könnten nur verwenden:

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

Erwarten Sie jedoch nicht, dass es sich um plattformübergreifende oder sogar Cross-Compiler-Überarbeitungen auf derselben Plattform handelt.

I think I've discussed this before...

+0

was bedeutet das fd in write (fd, ....)? ist das die Datei handhaben? es hat einige Zeiger darin .. =/ – krebstar

+0

fd == Dateideskriptor, wie von open() erhalten. Wenn Sie FILE * (von fopen) verwenden, können Sie fwrite() verwenden. –