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

Stupidus

Frischling

  • »Stupidus« ist der Autor dieses Themas

Beiträge: 41

Wohnort: Heilbronn

Beruf: Schöler

  • Private Nachricht senden

1

03.03.2006, 22:22

Verkettete Liste in Datei schreiben

Hi Leute,
wie kann man eine Verkettete Liste in eine Datei schreiben (bzw. eigentlich ist eher das wieder auslesen ein Problem )?? Es soll zum erstellen und Verwalten einer Highscoreliste dienen. Ich versuche nun schon seit ein paar Stunden dieses Problem zu lösen, komme aber auf keinen grünen Zweig... :(

Danke schon mal ;)

Stupidus

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

03.03.2006, 22:24

Einfach die Elemente alle der Reihe nach in die Datei schreiben, und ganz am Anfang noch die Anzahl der Elemente. Damit Du beim Einlesen weißt, wie viele Elemente Du lesen musst.

Stupidus

Frischling

  • »Stupidus« ist der Autor dieses Themas

Beiträge: 41

Wohnort: Heilbronn

Beruf: Schöler

  • Private Nachricht senden

3

03.03.2006, 22:39

Da ja die Funktion write von fstream eine Adresse auf eine Variable braucht, muss man bei einer Liste dies folgendermaßen angeben, oder:

C-/C++-Quelltext

1
2
3
// Iterator ist i


 Output.write ((char*) &(*i) , sizeof (int));


Da man ja auf die Adresse der Variable zugreifen muss.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

03.03.2006, 22:46

Daraus wird doch keiner schlau, zeig mal den kompletten Zusammenhang!

Stupidus

Frischling

  • »Stupidus« ist der Autor dieses Themas

Beiträge: 41

Wohnort: Heilbronn

Beruf: Schöler

  • Private Nachricht senden

5

03.03.2006, 22:47

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
50
51
52
53
54
55
56
57
58
59
60
#include <iostream>
#include <fstream>
#include <list>

using namespace std;


// Hauptprogramm

//

int main ()
{
    // Variablen

    //

    int Eintrag = 0;
    int Anzahl = 5;
    list<int> lListe;
    list<int>::iterator j;

    // Einträge in Liste schreiben

    for ( int i=0; i<Anzahl; i++ )
    {
        // Eintrag einlesen

        cout << i+1 << ". Platz: ";
        cin >> Eintrag;

        // Eintrag in Liste schreiben

        lListe.push_back (Eintrag);
    }

        // Datei öffnen

    ofstream Output ( "Highscore.hsg" , ios::binary );

    // Anazahl der Listen-Elemente in Datei schreiben

    Output.write ((char*) &Anzahl, sizeof (Anzahl));

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

    for ( j=lListe.begin (); j!=lListe.end (); j++ )
    {
        Output.write ((char*) &(*j) , sizeof (int));
    }


    Output.close ();

    // ANZAHL LÖSCHEN

    Anzahl =0;

    // Datei zum lesen öffnen

    ifstream Input ( "Highscore.hsg" , ios::binary );

    Input.read ((char*) &Anzahl , sizeof(Anzahl));

    cout << "Anzahl = " << Anzahl;

    Input.close ();



    return 0;
}

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

03.03.2006, 22:52

Das sollte funktionieren (natürlich ist das Einlesen noch nicht vollständig).
Tut es das nicht?

Stupidus

Frischling

  • »Stupidus« ist der Autor dieses Themas

Beiträge: 41

Wohnort: Heilbronn

Beruf: Schöler

  • Private Nachricht senden

7

03.03.2006, 22:56

ich glaube ich habe das Prob gelöst:

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <iostream>
#include <fstream>
#include <list>

using namespace std;


// Hauptprogramm

//

int main ()
{
    // Variablen

    //

    int Eintrag = 0;
    int Anzahl = 5;
    list<int> lListe;
    list<int>::iterator j;

    // Einträge in Liste schreiben

    for ( int i=0; i<Anzahl; i++ )
    {
        // Eintrag einlesen

        cout << i+1 << ". Platz: ";
        cin >> Eintrag;

        // Eintrag in Liste schreiben

        lListe.push_back (Eintrag);
    }

        // Datei öffnen

    ofstream Output ( "Highscore.hsg" , ios::binary );

    // Anazahl der Listen-Elemente in Datei schreiben

    Output.write ((char*) &Anzahl, sizeof (Anzahl));

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

    for ( j=lListe.begin (); j!=lListe.end (); j++ )
    {
        Output.write ((char*) &(*j) , sizeof (int));
    }


    Output.close ();

    // ANZAHL LÖSCHEN

    Anzahl =0;

    // Datei zum lesen öffnen

    ifstream Input ( "Highscore.hsg" , ios::binary );

    Input.read ((char*) &Anzahl , sizeof(Anzahl));

    cout << "Anzahl = " << Anzahl;

    // Datei auslesen

    for ( i=0 , j=lListe.begin (); i<Anzahl; i++ , j++)
    {
        Input.read ((char*) &(*j), sizeof (int));
    }

    // Liste ausgeben

    for ( j=lListe.begin (); j!=lListe.end (); j++)
    {
        cout << *j << endl;
    }

    Input.close ();



    return 0;
}

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

03.03.2006, 22:59

Da ist aber noch ein böser Fehler drin.
Beim Laden schreibst Du einfach direkt in die Liste rein.
Aber wenn die Liste vorher leer war?

mach mal:

C-/C++-Quelltext

1
2
3
4
5
// ANZAHL LÖSCHEN

Anzahl = 0;

// LISTE LEEREN

lListe.clear();


Dann wirst Du sehen, dass Dein Programm nicht mehr funktioniert.

Stupidus

Frischling

  • »Stupidus« ist der Autor dieses Themas

Beiträge: 41

Wohnort: Heilbronn

Beruf: Schöler

  • Private Nachricht senden

9

03.03.2006, 23:04

Stimmt, wenn ich das Programm laufen lasse, dann gibt er gar nichts aus! Aber ich hab das so gelöst:

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
// Liste Leeren

    lListe.clear ();

    // Datei zum lesen öffnen

    ifstream Input ( "Highscore.hsg" , ios::binary );

    Input.read ((char*) &Anzahl , sizeof(Anzahl));

    cout << "Anzahl = " << Anzahl;

    // Datei auslesen

    for ( i=0 ; i<Anzahl; i++ )
    {
        Input.read ((char*) &Eintrag, sizeof (int));

        lListe.push_back (Eintrag);
    }

    // Liste ausgeben

    for ( j=lListe.begin (); j!=lListe.end (); j++)
    {
        cout << *j << endl;
    }

    Input.close ();

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

03.03.2006, 23:08

Ja, so ist es richtig :)

Werbeanzeige