std::vector in struct aus datei lesen



  • Hi
    hier die Ausgangslage:

    Ich habe eine Struct in einer Datei geschrieben:

    struct C3DBone
    	{
    		float pos[3];
    		float rot[3];
    
    		vector<C3DKF> poskfs;
    	};
    

    das einzige Problem dabei ist nur, wie ich diese struct wieder auslesen kann.
    Eigentlich ja so:

    C3DBone temp;
    fread(&temp,sizeof(C3DBone),1,file);
    

    nun geht das aber nicht, weil die Struct eine dynamische arrays enthält (vector).
    Angenommen in der Struktur in der Datei ist dieser Vector 5 elemente groß.
    der vector in "temp" ist aber 0 elemente groß.
    Da hab ich mir gedacht, ich erweitere den vector in "temp" :

    for(int i=0;i<maxvec;i++)
    {
        temp.poskf.pushback(invalidelement);
    }
    

    jetzt müsste eigentlich genügend platz für den vector in der datei da sein, ist es aber nicht. es gibt ein runtime-error: unhandled exeption.
    hat jmd eine idee?



  • Warum packst du das Struct eigentlich in eine externe Datei? Warum codest du es nicht direkt mit in dein Projekt rein?Gibt es da einen tieferen Sinn?



  • ein export-plugin für milkshape3D (3D Model Programm) exportiert ja in eine datei.
    Also müssen die Structs, die das Model (Triangles,Vertices,Textures,...) enthalten ja in eine datei geschrieben werden.
    und dann werden sie später wieder von einen OpenGl programm ausgelesen und gerendert.



  • Warum schreibst du dir nicht einfach noch nen operator >> und <<?
    Über deine Lösung gibts glaube scho Millionen Beiträge, die immer auf das gleiche hinauslaufen:
    Compilerabhängig, wie das wird - das heißt, wenn man einmal das Programm mit xyz compilert und die Datei angelegt wird, ist nicht garantiert, dass das Programm, was mit abc compiliert wurde, die Datei richtig interpretiert...

    Überhaupt sieht das, was du hier schreibst eher nach C aus... [fread !!!]

    bb



  • Wenn du den Inhalt eines Vector serialisieren willst, musst du jedes Element (C3DKF) (sofern dieses "nur" POD typen enthält) einzeln binär speichern. zudem solltest du die anzahl der elemente mit abspeichern.

    struct C3DBone
        {
            float pos[3];
            float rot[3];
    
            vector<C3DKF> poskfs;
    
        };
    
    void serializeBone(const C3dBone &oScr){
    .....
    
       fread(&oScr.pos,sizeof(oScr.pos),1,file);
       fread(&oScr.rot,sizeof(oScr.rot),1,file);
    
       fread(&poskfs.size(),sizeof(poskfs.size()),1,file);
    
       for(size_t i=0; i< poskfs.size(); ++i){
         fread(&poskfs[i].INHALT,sizeof(poskfs[i].INHALT),1,file);
    .
    .
    .
    
       }
    
    }
    


  • ok das mit dem serialisieren ist eine gute alternative, so wirds gemacht, danke ^^
    ich hab mich nur gefragt, wie es auch anders gehen könnte. aber sch****egal: hauptsache es geht 😉 danke



  • servus fachmann,

    serialisierung wird so gemacht, es wird auf basis von POD typen der block gespeichert. Normalerweise leitet man die Klasse welche serialisiert werden soll von einer eigenen oder vorahnden serialisation klasse ab, welche eine extras methode enthält (oder std:stream "<<operator") die du in deiner klasse überschreiben musst. Diese Methode hat als parameter den datenziel/soruce stream darin speicehrt du binär die dateinen deienr klasse.

    PASS ABER AUF PADDING AUF...

    und nim stl stream stadt C FILE zeugs...

    fstream File("FILE.dat", ios::out|ios::binary|ios::in);
     File.write((const char*)&fYOURDATA, sizeof(YOURDATA));
     File.close();   // Datei schließen
    

Anmelden zum Antworten