2016-04-15 9 views
-1

Ich baue gerade eine benutzerdefinierte Binärdatei für eine riesige Liste von Daten, die einige Winkel der Bewegungen in einem Spiel darstellen wird. Obwohl ich in eine Wand renne, wenn ich versuche, einen Weg zu finden, alle Datenpunkte zu schreiben und sie dann in einem riesigen Array oder Vektor zu lesen.Liste der Objekte aus der Binärdatei lesen

Hier ist, wie ich mein Dateiformat aufgebaut:

class TestFormat { 
    public: 
     float x; 
     float y; 
     float z; 
}; 

Und den Testcode zum Schreiben und Lesen:

int main() 
{ 
    TestFormat test_1, temp; 
    test_1.x = 4.6531; 
    test_1.y = 4.7213; 
    test_1.z = 6.1375; 

    // Write 
    ofstream ofs("test.bin", ios::binary); 
    ofs.write((char *)&test_1, sizeof(test_1)); 
    ofs.close(); 

    // Read 
    ifstream ifs("test.bin", ios::binary); 
    ifs.read((char *)&temp, sizeof(temp)); 
    ifs.close(); 

    cout << temp.x << endl; 
} 

diesen Code zu erweitern, ich kann nur die zusätzlichen Objekte in die gleiche Datei schreiben , aber ich bin mir nicht sicher, wie ich diese Objekte später wieder in ein Array laden soll.

+1

Sie haben gerade geschrieben, dann gelesen, * one *. Also das für mehr als einen tun? – WhozCraig

+0

Hinweis: Wenn ein Objekt M aufeinanderfolgende Bytes belegt, dann und Array von N solche Objekte belegt N × M aufeinander folgenden Bytes. –

+0

Ich verstehe, was Sie sagen. Aber wie benutze ich die 'read' Funktion um mehrere Objekte zu lesen? – JavaCake

Antwort

1

Sie so etwas tun könnte:

vector<TestFormat> test; 
    //.... 
    // Read 
    ifstream ifs("test.bin", ios::binary); 
    while(ifs.read((char *)&temp, sizeof(temp))){ 
    //tmp to array 
    test.push_back(TestFormat(temp)); 
    } 
    ifs.close(); 

Peter Barmettler Vorschlag verwenden:

ifstream ifs("test.bin", ios::binary); 
ifs.seekg(0, std::ios::end); 
int fileSize = ifs.tellg(); 
ifs.seekg(0, std::ios::beg); 

vector<TestFormat> test(fileSize/sizeof(TestFormat)); 
ifs.read(reinterpret_cast<char*>(test.data()), fileSize); 
ifs.close(); 
+0

Dies ist eine interessante Lösung. Obwohl es scheint, als ob es den letzten Eintrag zweimal liest? – JavaCake

+0

Ja. Ich weiß nicht warum. Aber Sie können das Duplikat entweder ignorieren oder im Falle der Vektorverwendung aufheben. – Carafini

+0

Noch etwas verstehe ich nicht mit dem Duplikat auf dem letzten Objekt. – JavaCake

1

Zum Beispiel, wenn Sie Einträge haben, können Sie etwas tun können:

std::vector<TestFormat> temp(2); 

ifstream ifs("test.bin", ios::binary); 
ifs.read((char *)temp.data(), temp.size()*sizeof(TestFormat)); 
ifs.close(); 

cout << temp[1].x << endl; 
+0

Ich kann x Anzahl der Einträge haben, daher kann ich nichts vordefinieren .. – JavaCake

+0

Dann ist etwas in der Art von Adriano Carafini der Weg zu gehen. Oder Sie platzieren die Anzahl der Einträge in der Kopfzeile Ihrer Datei. –