2016-04-01 16 views
1

Ich bin verwirrt, wenn ich ein Objekt in C++ in eine Binärdatei geschrieben habe. Als ich schrieb einen String in einer Datei, wie folgt aus:schreibe ein Objekt in eine Binärdatei in C++

//write a string to a binary file 
ofstream ofs("Test.txt", ofstream::binary | ofstream::app); 
string foo = "This is a long .... string." 
ofs.write((char*)&foo, sizeof(foo)); 
ofs.close(); 

Aber es schrieb etwas anderes (vielleicht ein Zeiger) auf die Datei anstatt die Zeichenfolge selbst.

Wenn ich ein Objekt einer Klasse (die ein String-Mitglied hat) schrieb, funktionierte es.

// a simple class 
class Person { 
public: 
    Person() = default; 
    Person(std::string name, int old) : fullName(name), age(old) {} 
    std::string getName() const { return this->fullName; } 
    int getAge() const { return this->ID; } 

private: 
    string fullName; 
    int age; 
}; 

int main() 
{ 
    std::ofstream ofs("Test.txt", std::ofstream::binary | std::ofstream::app); 
    Person p1("lifeisamoive", 1234); 
    ofs.write((char*)&p1, sizeof(Person)); 
    ofs.close(); 

    Person *p2 = new Person(); 
    std::ifstream ifs("Test.txt", std::ifstream::binary); 
    //output the right information 
    while(ifs.read((char*)p2, sizeof(Person))) 
     std::cout << p2->getName() << " " << p2->getAge() << std::endl; 
    else 
     std::cout << "Fail" << std::endl; 
    ifs.close(); 
    return 0; 
} 

Es gibt die richtigen Informationen aus.

Warum? Vielen Dank.

Antwort

0

Sie lesen die Speicheradresse des Personenobjekts. Das Person-Objekt besteht aus einem String-Objekt und einem int-Objekt. Das Lesen dieser Werte aus dem Speicher, während das Programm noch läuft, bedeutet dasselbe wie das Kopieren des Objekts über einen Operator =.

1

String-Objekt enthält Zeiger auf Heap, wo der eigentliche Text bleibt. Wenn Sie das Objekt in einer Datei speichern, speichern Sie die Zeiger, aber nicht das, worauf sie zeigen.

Im zweiten Beispiel lesen Sie den Zeiger auf das tatsächliche char-Array in p1 bis p2 und da p1 noch existiert, können Sie den gleichen Namen sehen. Sie haben jedoch immer noch das gleiche Problem, Sie haben die tatsächlich lesbare Zeichenfolge nicht wirklich in einer Datei gespeichert.

Sie sollten keine Objekte mit Zeigern auf Heap in Datei speichern. Sie können die Zeichenkette nicht einfach durch Gießen in den Zeichenzeiger konvertieren. Sie sollten stattdessen c_str() verwenden. Also versuchen Sie etwas wie:

ofstream ofs("Test.txt", ofstream::binary | ofstream::app); 
string foo = "This is a long .... string." 
ofs.write(foo.c_str(), foo.size()); 
ofs.close(); 
+0

Ja, ich habe es. Ich verstehe, warum es nicht empfohlen wird, ein Objekt direkt in eine Datei zu schreiben, besonders wenn Sie nicht sicher sind, ob die Klasse ein POD-Typ ist. Vielen Dank. – lifeisamoive

Verwandte Themen