Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

11

15.04.2011, 14:20

So nicht, da Input.read ja keine Klasse oder so zurückgibt.
Du müsstest ein temporäres Objekt erstellen und die einzelnen Member dann einlesen und schließlich an die Liste hängen.
Oder du legst ein neues Objekt auf dem Heap an und ließt auch hier wieder die einzelnen Member ein, allerdings musst du es dann auch mit delete wieder freigeben.

12

15.04.2011, 14:36

Könnte ich also Die Data öffnen und sagen

C-/C++-Quelltext

1
2
3
ofstream Output ("Fleet1.data", ios::binary);
Output.write (reinterpret_cast<char*>(&(*it->GetGeld)), sizeof(*it->GetGeld));
Output.write (reinterpret_cast<char*>(&(*it->Getkekse)), sizeof(*it->Getkekse));


Wenn ich es so machen würde und ich lese zb 4Schiffe ein kann ich es dann so öffnen:

C-/C++-Quelltext

1
2
3
4
ifstream Input ("Fleet1.data", ios::binary);
CSpaceship Ship
CShip.SetGeld = Input.read (reinterpret_cast<char*>(&(*it->GetGeld)), sizeof(*it->GetGeld)));
FleetList1.push_back(Ship);


Würde das so gehen?

#Edit
Nein klappt leider nicht aber vllt so ähnlich?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Chris13« (15.04.2011, 14:46)


13

15.04.2011, 15:19

Das schreiben funktioniert so ja. Du musst praktisch immer alles in primitive Typen zerlegen und dann schreiben.
Das Lesen funktioniert eigentlich ähnlich wie das schreiben. Wie gesagt gibt Input.read () nichts zurück was mit deiner Klasse zu tun hat, deswegen kannst du da nicht einfach ein = hinhauen.

So müsste es funktionieren:

C-/C++-Quelltext

1
2
3
4
5
6
ifstream Input ("Fleet1.data", ios::binary);
CSpaceship Ship;
int Geld;
Input.read (reinterpret_cast<char*>(&Geld), sizeof(Geld));
CShip.SetGeld (Geld);
FleetList1.push_back(Ship);


Das wäre dann für genau 1 Schiff. Wenn du mehrere Speichern/Laden willst, dann schreib ganz am Anfang beim Speichern noch in die Datei, wie viele Schiffe in der Datei gespeichert sind. Dann ließt du in einer Schleife die Schiffe ein.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

14

15.04.2011, 15:26

du könntest auch nen konstruktor schreiben der eine referenz auf den stream entgegennimmt.
beispiel:

C-/C++-Quelltext

1
2
3
4
Ship::Ship(std::istream& stream)
{
    stream.read (reinterpret_cast<char*>(&_Geld), sizeof(Geld));
}

verwendung:

C-/C++-Quelltext

1
FleetList1.push_back(Ship(Input));


alternativ könntest du den streamoperator überladen oder eine loadmethode schreiben und sie so verwenden:

C-/C++-Quelltext

1
2
iFleetList1.push_back();
iFleedList1.rBegin()->load(Input);
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

15

15.04.2011, 17:17

Ein großes danke nochmal an NachoMan der mir über icq alles nötige erklärt hat. Hier die lösung für alle die auch an der Stelle hängen.

Spaceship.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
CSpaceship::CSpaceship(std::istream &stream)
{
    stream >> m_PAttackpower;
    stream >> m_EAttackpower;
    stream >> m_Armor;
    stream >> m_Shield;
    stream >> m_Engine;
    stream >> m_fHealth;

    // Raumschiff lebt
    m_bIsAlive = true;
}


Flotte1 speichern

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
void CEvent::SaveFleet1()
{
    // Datei zum schreiben öffnen
    remove("Fleet1.data");
    ofstream Output ("Fleet1.data");

    if(Output == NULL)
    {
        cout << "Datei konnte nicht geöffnet werden." << endl;

        // Fehler
        system ("Pause");
    }
    int     PAttackpower    = 2;
    int     Ettackpower     = 2;
    int     Armor           = 2;
    int     Shield          = 2;
    int     Engine          = 2;
    float   fHealth         = 2.0f;

    // Anzahl der Listen-Elemente in Datei schreiben
    unsigned int numOfShips = m_FleetList1.size();
    Output << numOfShips << '\n';

    // Liste einzeln durchgehen und Einträge in Datei schreiben
    list<CSpaceship>::iterator it = m_FleetList1.begin ();
    while(it != m_FleetList1.end ())
    {
        PAttackpower    = it->GetPAttackpower ();
        Ettackpower     = it->GetEAttackpower ();
        Armor           = it->GetArmor ();
        Shield          = it->GetShield ();
        Engine          = it->GetEngine ();
        fHealth         = it->GetHealth ();

        Output << PAttackpower << '\n';
        Output << Ettackpower << '\n';
        Output << Armor << '\n';
        Output << Shield << '\n';
        Output << Engine << '\n';
        Output << fHealth << '\n';
        it++;
    }

    // Datei schließen
    Output.close ();


} // SaveFleet1



Flotte 1 laden

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void CEvent::LoadFleet1()
{
    // Liste leeren
    m_FleetList1.clear ();

    // Data laden
    ifstream Input ("Fleet1.data");

        // Falls sie nicht geöffnet werden kann
    if(Input == NULL)
    {
        cout << "Datei konnte nicht geöffnet werden." << endl;

        // Fehler
        system ("Pause");
    }
    unsigned int numOfShips;
    Input >> numOfShips;

    for(unsigned int i = 0; i < numOfShips; i++)
    {
        CSpaceship Ship(Input);
        m_FleetList1.push_back(Ship);
    }

    Input.close ();
}// LoadFleet1

16

15.04.2011, 18:34

Hm warum nicht

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Spaceship
{
protected:
    int m_health;
    std::string m_name;
    
private:
    std::istream& read(std::istream& in)
    { 
        std::string buffer;
        std::getline(in, buffer);
        std::istringstream ss(buffer);
        ss >> m_health >> m_name; 
        return in;
    }

public:
    friend std::istream& operator<<(std::istream& in, CSpaceship& rhs)
    { return rhs.read(in); }
}; 
:P

dann geht auch:

C-/C++-Quelltext

1
2
3
std::list<Spaceship> ships;
std::ifstream stream("ships.dat");
std::copy(std::istream_iterator<Spaceship>(stream), std::istream_iterator<Spaceship>(), std::back_inserter(ships));
und schon ist die Datei ausgelesen ;)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Werbeanzeige