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

1

14.04.2011, 19:09

Verkettete Listen Daten in Datei schreiben

Hey.
Ich würde gerne eine Verkettete Liste in eine Datei schreiben nur weiß ich leider nicht wie ich hab jetzt auch schon ein wenig rumprobiert und auch im Forum gesucht erfolg gleich null^^.
Danke schonmal für eure Hilfe.

Daten einlesen:

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
    // Datei zum schreiben öffnen
    ofstream Output ("Fleet1.data", ios::binary);

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

        // Fehler
        system ("Pause");
    }
    // Anzahl der Listen-Elemente in Datei schreiben
    unsigned int numOfShips = m_FleetList1.size();
    Output.write ((char*) &numOfShips, sizeof(numOfShips));

    // Liste einzeln durchgehen und Einträge in Datei schreiben

    list<CSpaceship>::iterator it = m_FleetList1.begin ();
    while(it != m_FleetList1.end ())
    {
        
        Output.write (reinterpret_cast<char*>(&(*it)), sizeof(*it));
        it++;
    }

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


Daten wieder auslesen

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
        // Liste leeren
    m_FleetList1.clear ();

    ifstream Input ("Fleet1.data", ios::binary);

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

        // Fehler
        system ("Pause");
    }

    // Liste aus der Datei lesen
    unsigned int numOfShips;
    Input.read ((char*) &numOfShips, sizeof(numOfShips));
    numOfShips = m_FleetList1.size();

    // Liste einzeln durchgehen und Einträge in Datei schreiben

    list<CSpaceship>::iterator it = m_FleetList1.begin ();
    while(it != m_FleetList1.end ())
    {
        
        Input.read (reinterpret_cast<char*>(&(*it)), sizeof(*it));
        it++;
    }

    Input.close ();
}// LoadFleet1

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Chris13« (14.04.2011, 19:30)


NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

2

14.04.2011, 19:13

du vergisst den iterator zu dereferenzieren.

C-/C++-Quelltext

1
Input.write(reinterpret_cast<char*>(&(*it)), sizeof(*it));

würde eher klappen.
generell ist es eine schlechte idee ganze klassen mit write in eine datei oder einen string zu schreiben.(falls es überhaupt funktioniert^^) du könntest den streamoperator überschreiben oder wenigstens eine savemethode der du den stream als referenz übergibst schreiben.
"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?

3

14.04.2011, 19:16

Geht leider auch nicht meine Spaceship.hpp sieht so aus:

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
#ifndef SPACESHIP_HPP
#define SPACESHIP_HPP

#include "Console.hpp"

using namespace std;

class CSpaceship
{
public:

    void Init(int PAttackpower, int EAttackpower, int Armor, int Shield, int Engine, int Health);   // Neues Raumschiff erstellen
    void Data ();                                           // Ausgabe der Daten
    void SetIsAlive(bool bIsAlive){m_bIsAlive = bIsAlive;}  // Raumschiff Leben true/false
    bool GetIsAlive(){return m_bIsAlive;}                   // Lebt das Raumschiff noch?

private:

    bool m_bIsAlive;        // Lebt das Raumschiff?
    int m_PAttackpower;     // Plasmaangriffskraft
    int m_EAttackpower;     // Energieangriffskraft
    int m_Armor;            // Panzerung
    int m_Shield;           // Schilde
    int m_Engine;           // Antrieb
    int m_Health;           // Lebenspunkte

};

#endif

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Chris13« (14.04.2011, 19:23)


NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

4

14.04.2011, 19:19

hab oben editiert. wieso sind deine daten public?
methoden sollte man in jedem fall in der .cpp definieren.

C-/C++-Quelltext

1
Output.write ((char*) &m_FleetList1, m_FleetList1.size() );

das kann natürlich auch nicht funktionieren. du musst den wert zwischenspeichern.

C-/C++-Quelltext

1
2
unsigned int numOfShips = m_FleetList1.size();
Output.write ((char*) &numOfShips, sizeof(numOfShips));


ich glaub die streamoperatoren sind besser für dich geeignet^^
"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?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NachoMan« (14.04.2011, 19:24)


5

14.04.2011, 19:21

Daten sind public weil ich gehofft habe so eine möglichkeit zu finden das ganze in eine Datei zu schreiben. Bin aber nicht wirklich weiter wie kann ich das ganze mit einer referenz den speichern? Es geht halt darum das man pro Flotte ungefährt 1000 oder mehr Schiffe hat und man für jedes Schiff einzeln in einer Konsole die Daten(Angriff, def else) eingeben muss und wenn man es nicht speichern kann wäre das einfach zu viel Arbeit.

Edit:

Hab oben das ganze mal aktualisiert geht allerdings immer noch nicht :(.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Chris13« (14.04.2011, 19:31)


NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

6

14.04.2011, 19:30

oben editiert.
ich hab meinem projekt auch vor kurzem 500zeilen hinzugefügt weil ich für jedes element eine zeile brauchte :/
beispiel:

C-/C++-Quelltext

1
2
3
4
void cPlayer::save(std::ostream& stream)
{
    stream.write(reinterpret_cast<char*>(&m_Credits), sizeof(m_Credits));
}


aber schau mal lieber hier. lies bitte zumindest die ersten beiden posts bevor du copy&paste machst.
"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?

7

14.04.2011, 19:34

oben editiert.
ich hab meinem projekt auch vor kurzem 500zeilen hinzugefügt weil ich für jedes element eine zeile brauchte :/
beispiel:

C-/C++-Quelltext

1
2
3
4
void cPlayer::save(std::ostream& stream)
{
    stream.write(reinterpret_cast<char*>(&m_Credits), sizeof(m_Credits));
}


aber schau mal lieber hier. lies bitte zumindest die ersten beiden posts bevor du copy&paste machst.


Muss mir das eh alles erstmal durchlesen bevor ich was kopiere. Danke schonmal. Ich mach für heute erstmal eine pause und setzte morgen an der Stelle fort^^.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Chris13« (14.04.2011, 19:40)


8

15.04.2011, 10:39

Ich hätte da nochmal eine Frage. Wie kann ich an size() der Liste einen Wert übergeben?

C-/C++-Quelltext

1
2
3
    unsigned int numOfShips;
    Input.read ((char*) &numOfShips, sizeof(numOfShips));
    m_FleetList1.size() ? &numOfShips;

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Chris13« (15.04.2011, 11:42)


BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

9

15.04.2011, 12:41

Es ist nicht möglich, die Länge einer Liste zu setzen. Die Liste verlängert bzw. verkürzt sich beim Hinzufügen/Löschen von Elementen automatisch.

10

15.04.2011, 13:56

Ok danke ist es den möglich etwas direkt in die Liste einlesen zu lassen zb. in der Art sowas:

C-/C++-Quelltext

1
m_FleetList1.push_back(Input.read (reinterpret_cast<char*>(&(*it)), sizeof(*it)));

Werbeanzeige