Vector (Objekt) in Binär datei schreiben



  • servus ich hab da ein klitzekleines problemchen,
    ich hab einen vector bsp. vector<Team>Teamtable das sind fein säublerlich
    abgespeichert.
    1x string und 5x ints
    das heisst ich kann schön auf den vector zugreifen mit .. bsp.
    ner forschleife und schreiben Teamtable[i].getTeamName() damit ich an die werte komme

    nun kann ich bsp eine txt-datei schreiben mit ner funktion

    ostream& Table::write(std::ostream &os) 
    {
    for.....blabla
     os<<this->Teamtable[i].getTeamName();
     os<<this->Teamtable[i].getMatchesPlayed();
     ... 
    
    return os;
    }
    

    und er schreibt das in meine schön txt datei
    jetzt brauch ich aber eine binär datei
    das heisst also in der form

    ostream& Table::binWrite(std::ostream& os)
    {
     os<<teamName<<'\0'; 
     os.write(reinterpret_cast<char*>(&matchesPlayed), 5*sizeof(int)); 
    // geht nicht weil matchesPlayed privatattribut ist , müsste normal 
    //mit funktion zugreifen , das geht aber auch net oder weiss net wie .. also wie gehts? weil (&getMatchesPlayed() ) geht net
    //oder dergleichen nur leider wie geb ich den vector dahin als adresse, 
    //hab wohl problem mit der adressierung..
    }
    

    wäre dankbar für Rat und Tat



  • dann speicher das ergebnis von getMatchesPlayed() erst in eine lokale variable



  • Edit: quark
    Edit2: machs doch einfach genauso weiter, wie du angenfangen hast. Ruf für jedes Element der TeamTable einfach eine Methode zum speichern auf.

    ostream& Table::binWrite(std::ostream& os)
    {
     for blabla
       this->Teamtable[i].Save(os);
    }
    

    Die Methode weiss dann was zu tun ist und hat keine Einschraenkungen beim Zugriff.

    Gruss,
    DeSoVoDaMu



  • DeSoVoDaMu schrieb:

    Edit: quark
    Edit2: machs doch einfach genauso weiter, wie du angenfangen hast. Ruf für jedes Element der TeamTable einfach eine Methode zum speichern auf.

    ostream& Table::binWrite(std::ostream& os)
    {
     for blabla
       this->Teamtable[i].Save(os);
    }
    

    Die Methode weiss dann was zu tun ist und hat keine Einschraenkungen beim Zugriff.

    Gruss,
    DeSoVoDaMu

    this->Teamtable[i].Save(os);
    

    ist das binär? sieht nicht danach aus (ist .Save(os) eine std:-methode?)

    os.write(reinterpret_cast<char*>(&matchesPlayed), 5sizeof(int));
    ist binär schreiben ,d.h. das os.write, sie ist funktion dafür,
    &matchesPlayed ist die adresse des startes und 5
    sizeof(int) ist die platzbelegung das nur 5 weitere int-werte kommen...

    unregistrierter:
    dann speicher das ergebnis von getMatchesPlayed() erst in eine lokale variable

    das hatte ich probiert aber er schrieb falsch..in die datei.. weiss net warum. hatte bsp alle getfunktionen benutzt in der form

    for....blabla{
    teamnamevalue=this->Teamtable[i].getTeamName(); 
     matchesvalue=Teamtable[i].getMatchesPlayed();}
    .. andere ints in lokalevariablen...
    danach hatte ich geschrieben
     os<<teamName<<'\0'; 
     os.write(reinterpret_cast<char*>(&matchesvalue), 5*sizeof(int));
    

    nun hatte er die datei zwar geschrieben aber nur teamname und matchedPlayed richtig die anderen hatte er falsch. von daher glaube ich er braucht den vector als zusammenhängenden speicher damit er weis was als nächste folgt .. der
    compiler wird mit den anderen lokalen variable nichts anfangen können weil sie net zusammenhängend sind (wegen 5*sizeof(int)) ➡ is eine vermutung , wissen tue ichs net. hmm 😕



  • Das sollte einfach nur die Herangehensweise verdeutlichen. Die Save-Methode musst du natuerlich selbst implementieren.

    void Team::Save(std::ostream os)
    {
      os.write(reinterpret_cast<char*>(&matchesPlayed), sizeof(matchesPlayed));
      .
      .
    }
    
    ostream& Table::write(std::ostream &os)
    {
    for.....blabla
      this->Teamtable[i].Save(os);
      .
      .
    
    return os;
    }
    

    Innerhalb von Team hast du ja freien Zugriff auf die eigenen Membervariablen.

    Gruss,
    DeSoVoDaMu



  • [quote="DeSoVoDaMu"]Das sollte einfach nur die Herangehensweise verdeutlichen. Die Save-Methode musst du natuerlich selbst implementieren.

    void Team::Save(std::ostream os)
    {
      os.write(reinterpret_cast<char*>(&matchesPlayed), sizeof(matchesPlayed));
      .
      .
    }
    

    SUPER!!
    dankeee hat gefunzt mit

    void Team::save(std::ostream &os)
    { 
    	os<<teamName<<'\0';
    	os.write(reinterpret_cast<char*>(&matchesPlayed),5*sizeof(int)); 
    	//5* int wegen der datenstruktur 
    }
    

    man is echt blöd manchmal, weil ich eigentlich das selbe schon mit auslesen gemacht habe. . aber wenn man auf den schlauch hockt gibs immer noch das c++ forum 😃 also danke nochmal


Anmelden zum Antworten