Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Vector mit Klassen speichern und laden

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
20.04.2017, 21:41 Uhr
elBlindo



Huhu liebe Leute,
wie kann ich einen Vector der selbsterstellte Klassen enthält, in einer Datei speichern und wieder ins Programm laden?
Also es ist so eine art Lagerverwaltungsprogramm da soll am ende der Vector gespeichert werden und beim neustart des Programms wieder geladen werden.

Die Klasse enthält einen string und zwei int Dateien.

Ich habe seit 2 Tagen alles ausprobiert. Binär als Text und habe auch sämtliche Suchfunktionen von sämtlichen Foren durch.

Ich schmeiss auch eine imaginäre Grillparty wenn mir wer helfen kann.

Vielen Dank schonmal.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.04.2017, 10:04 Uhr
ao

(Operator)


Das Stichwort heißt "Serialisierung" oder englisch "serialization".

Guter Einstieg mit vielen Ideen: http://stackoverflow.com/questions/234724/is-it-possible-to-serialize-and-deserialize-a-class-in-c
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
21.04.2017, 15:03 Uhr
elBlindo



Das habe ich auch schon probiert. Das mit Boost hat überhaupt nicht geklappt, also die insallation. Musste hinterher sogar VisualStudio neu installieren.

es muss da doch eine Möglichkeit in c++ geben ohne zusatzlibraries.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.04.2017, 16:02 Uhr
elBlindo




C++:
#include <iostream>
#include <string>
#include <fstream>

    class lager
    {
    public:

        std::string name;
        int bestand;

    };

int main()
{

    lager artikel;
    artikel.name = "Hammer";
    artikel.bestand = 500;

    std::cout << "Vor dem lesen: " << artikel.name << " Bestand: " << artikel.bestand << std::endl;

    std::ofstream schreiben("artikel.blt", std::ios::binary);
    schreiben.write((char*)&artikel, sizeof(lager));
    schreiben.close();

    artikel.name = "NIX";
    artikel.bestand = 0;

    std::cout << "Nach dem clear: " << artikel.name << " Bestand: " << artikel.bestand << std::endl;

    std::ifstream lesen((char*)&artikel, sizeof(lager));
    lesen.close();

    std::cout << "Nach dem lesen: " << artikel.name << " Bestand: " << artikel.bestand << std::endl;


Nichtmal das funktioniert, obwohl 1:1 von Youtube abgeschrieben.

Dieser Post wurde am 21.04.2017 um 17:45 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
21.04.2017, 17:56 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat:

Nichtmal das funktioniert, obwohl 1:1 von Youtube abgeschrieben.



Kann es auch nicht. ist ziemlicher "murks".

1. Serialization sollte von "lager" selbst gemacht werden (Memberfunktionen)
2. sizeof(lager) gibt vermutlich 8 (32bit-system) bzw 12 aus (64bit) , da "string" ein komplexer Typ ist.

Sinnvoller ist vermutlich sich lade + schreibfunktionen in "lager" zu implementieren.

Eine Idee ist, welche man auch für Ausgabe auf der Konsole benutzen kann:

Mal so ohne "Gewehr" aus der Hüfte geschossen:


C++:
class lager
    {
    public:

        std::string name;
        int bestand;

        // Klassen-daten in form von "name bestand" in stream schreiben
        std::ostream& operator<<(std::ostream& out) {
             out << name << " " << bestand << "\n";
             return out;
        }

        // aus stream lesen,  keinerlei fehler abfragen, aber es geht in ums beispiel
        // name darf kein leerzeichen enthalten
        std::istream& operator>> (std::istream& in); {
             std:string line;
             std::getline(in, line);
             std::ostringstream i(line);
             i >> name;
             i >> bestand;
             return in;
        }

    };

int main()
{
    lager artikel;
    artikel.name = "Hammer";
    artikel.bestand = 500;

    std::ofstream schreiben("artikel.blt");
    schreiben << artikel;
    schreiben.close();

    lager artikel2;
    std::ifstream lesen("artikel.blt"); // hier hattest du öffnen der datei und lesen durcheinander gebracht!
    lesen >> artikel2;
    lesen.close();

    assert(artikel2 == artikel);

    std::cerr << "Artikel:" << artikel << std::endl;
    std::cerr << "Artikel2:" << artikel2 << std::endl;
}




Zur Initialisierung solltest du ebenfalls einen Konstruktor in lager hinzufügen, sowie die Variablen nur über getter&setter zugreifbar machen, sonst kann dir jeder "fremde" in deinem Artikel rumpfuschen. Kapselung ist da das stichwort.
--
class God : public ChuckNorris { };

Dieser Post wurde am 21.04.2017 um 17:57 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
23.04.2017, 21:28 Uhr
elBlindo



Habe es jetzt in Textfor per setter/ getter gespeicher.
Jetzt habe ich das Problem das er mir den letzten eintrag immer doppel ausliest.


C++:
     std::ifstream lesen("artikel.blt");
     if (lesen.is_open())
     {
         int artnr = 0, bstnd = 0;
         std::string nme = " ";
         while (lesen)
         {
             lesen >> nme;
             lesen >> artnr;
             lesen >> bstnd;
             temp.setname(nme);
             temp.setartnummer(artnr);
             temp.setbestand(bstnd);
             lager.push_back(temp);
         }
         lesen.close();
     }







naja das fail bzw auch das eof flag wird erst gesetzt, wenn ein lesevorgang schiefgeht


C++:
if(! lesen >> nme) break;
if(! lesen >> artnr) break;
if(! lesen >> bstnd) break;



dann sollte er bei einem lesefehler aufhören weiterzulesen

Dieser Post wurde am 23.04.2017 um 22:12 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
23.04.2017, 22:42 Uhr
elBlindo



javascript:insert_tag('
C++:



     std::ifstream lesen("artikel.blt");
     if (lesen.is_open())
     {
         int artnr = 0, bstnd = 0;
         std::string nme = " ";
         while (lesen)
         {
             std::getline(lesen,nme);
             lesen >> artnr;
             lesen >> bstnd;
            
             if (!lesen.eof())
             {
                 temp.setname(nme);
                 temp.setartnummer(artnr);
                 temp.setbestand(bstnd);
                 lager.push_back(temp);
             }
         }
         lesen.close();
     }

',1)

so hab ich es jetzt hinbekommen. Ist das auch ok?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
23.04.2017, 22:47 Uhr
elBlindo



Allerding liest er jetzt nicht mehr den Namen ein wenn er Leerzeichen hat.

Habe mit
javascript:insert_tag('
C++:
'

     std::ifstream lesen("artikel.blt");
     if (lesen.is_open())
     {
         int artnr = 0, bstnd = 0;
         std::string nme = " ";
         while (lesen)
         {
             std::getline(lesen,nme);
             lesen >> artnr;
             lesen >> bstnd;


'

',1)

getline auch keinen Erfolg.javascript:insert_smiley('')
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
24.04.2017, 00:02 Uhr
elBlindo



Ok hat sich erledigt.
Habe die anderen mit stringstream umgewandelt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: