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

spacegaier

Alter Hase

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

51

19.02.2006, 13:40

Feu mich!!! :roll:

Sorry wegen dem Namen. Werd's korrigieren. :huhu:

Sheddex

unregistriert

52

19.02.2006, 13:41

Hier wird der Held erstellt und gespeichert:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
CCharacter Hero;

Hero.CreateHero ();

cout << endl << "Beliebige Taste druecken" << endl;
getch ();
system ("cls");

SaveCharacter ();

ofstream Output ("Character.save", ios::binary);
Output.write ((char*) &Hero, sizeof (Hero));
Output.close ();


Das 'SaveCharacter ()' dient nur dazu, einen sinnlosen Speicherbalken aufzurufen...

Noch ist es nur möglich einen Charakter zu speichern, später wird es mehrere Spielstände geben.

spacegaier

Alter Hase

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

53

19.02.2006, 13:44

Und man kann dann das Spiel verlassen und wieder starten und dann ab dem Speicherstand weiterspielen?

Sheddex

unregistriert

54

19.02.2006, 13:49

Ach ja, davor muss man noch <fstream> einbinden. Laden geht so:

C-/C++-Quelltext

1
2
3
ifstream Input ("Character.save", ios::binary);
Input.read ((char*) &Hero, sizeof (Hero));
Input.close ();


Statt Input bzw. Output kann man auch andere, beliebige Bezeichnungen verwenden.

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

55

19.02.2006, 13:56

Ich hoffe ich kann dir heelfen :)

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
73
74
75
76
77
78
79
80
81
82
83
84
#include <stdio.h>
#include <string.h>

typedef struct MSDS
{
    int key;
    char name[30];
} MySafeDataStructure;

__int32 main(void)
{
    FILE* pFile = NULL;
    MySafeDataStructure mdata[20];  // 20 Speichereinträge mgl.

    int read = 0;

    // Wie müssen uns jetzt eine Dateistruktur ausdenken. 

    // Diese ist nicht besinders gut, aber fürn Anfang reichts:

    //

    //

    //  Anfang der Datei:

    //  Typen                   | Sinn

    //----------------------------------------------------

    //  (int)                   | Anzahl der Speicherinträge

    //  (MySafeDataStructure)   | Speichereinheit 0

    //  (MySafeDataStructure)   | Speichereinheit 1

    //  (MySafeDataStructure)   | Speichereinheit 2

    //  (MySafeDataStructure)   | Speichereinheit 3

    // ... bis speichereinheit 20.


    if(!(pFile = fopen("test.dat", "w")))
    {
        printf("Datei konnte nicht geschrieben werden");
        return 0;
    }

    printf("Datei geoffnet\n");

    // Struktur ausfüllen

    mdata[0].key = 34;
    strcpy(mdata[0].name, "test");
    // Wir haben einen gültigen eintrag

    read=1;                         

    // ein Int, also 4Byte in den Anfang der Datei

    fwrite(&read, sizeof(__int32), 1, pFile);
    // dann noch alle 20 Einträge hinein!

    fwrite(mdata, sizeof(MySafeDataStructure), 20, pFile);
    // und schon fertig.... war doch gar nicht so schlimm :)


    printf("schreiben abgeschlossen\n");

    // Schliessen, Pointer auf NULL nicht vergessen

    fclose(pFile); pFile = NULL;
    printf("Datei geschlossen\n\n");

    // und jetzt das gemurks wieder lesen....

    // Datei wieder öffnen....

    if(!(pFile = fopen("test.dat", "r+")))
    {
        printf("Datei konnte nicht geöffnet werden");
        return 0;
    }
    printf("Datei wieder geoeffnet\n");

    // nzahl der gültigen Speichereinheiten lesen...

    fread(&read, sizeof(int), 1, pFile);
    // Alle speichereinheiten nun noch...

    fread(mdata, sizeof(MySafeDataStructure), 20, pFile);
    
    printf("lesen abgeschlossen\n");

    // Schliessen, Pointer auf NULL nicht vergessen

    fclose(pFile); pFile = NULL;
    printf("Datei geschlossen\n\n");

    // Nun noch die Ausgabe :)

    for(__int32 i = 0; i< read; i++)
    {
        printf("Speichereinheit: %d \n  key: %d\n  name: %s\n\n", i+1, mdata[i].key, mdata[i].name);
    }

    scanf("%d", &read);

}

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

56

19.02.2006, 14:02

ist zwar noch gutes, altes C zeigt aber meiner Meinung nach wesentlich besser den Umgang mit Dateien :)

Sheddex

unregistriert

57

19.02.2006, 14:07

So viel? Naja, ich bleib bei den Streams...

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

58

19.02.2006, 14:50

mit streams wäre das genauso groß, du speicherst aber nur eine Klasse herein, ich ein int und eine struktur. Das ist der Unterschied. Ausserdem ist unwichtig was länger und was nicht ist, es ist wichtig das man weiss was passiert.

59

19.02.2006, 14:51

Also Spacegaier:

Beim Speichern möchtest du ja verschiedene Variablen, Strings, Arrays, vllt auch Strukuren direkt usw. abspeichern. Das alles geht mit FStream.

Generell ist es ein leichtes solche Daten zu speichern. Schwieriger ist das Laden. Hier ist zwar das einlesen von den Variablen genauso einfach wie das abspeichern, aber man muss dann schon sehr drauf achten das keine falschen Berechnungen durchgeführt werdern oder so!

Also hier mal ein paar Grundlegende Sachen, ich hoffe die helfen dir:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
    int a = 100; // Beispielvariable


ofstream Output ("Test.txt"); // Lege die Datei "Test.txt" an

Output.write ((char*) &a, sizeof (a)); // Speichere den Wert von a ab 

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


a = 0 // Erzwingen das a = 0 ist


ifstream Input ("Test.txt"); // Öffne die Datei "Test.txt"

Input.read ((char*) &a, sizeof(a)); // Lies den Wert von a und weise ihn der Variable zu

Input.close (); // Stream schließen


cout << a << endl; // Beweis das a wieder = 100 ist!


Das ist erstmal grundlegend wie man mit Dateien arbeiten kann!

C-/C++-Quelltext

1
2
3
4
5
if (Input == NULL)
{
        std::cout << "Fehler beim oeffnen von " << Dateiname << "\a" << std::endl; // \a ist ein Piepton, std:: nur schreiben wenn du using namespace std nicht verwendest!

        std::cout << "Program abort!" << std::endl;
}


Das ist dann die Ausgabe eines Fehlers. Das passiert zB dann, wenn die Datei schreibgeschützt ist! Auch nur ganz grundlegend erklärt :)

Wenn du jetzt noch den Dateinamen mit angeben möchtest/musst kannst du das zB so machen:

C-/C++-Quelltext

1
2
3
4
5
char buffer[50]; // Dateiname in String


sprintf (buffer, "Test.txt"); // Zuweisung des Dateinamens

ifstream Input (buffer); // Öffne die Datei "Test.txt"

cout << buffer; // Dateiname nennen

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

60

19.02.2006, 15:07

Also nochmal. Das Prrogramm von mir oben zweigt wie man mehrere Variablen in eine Datei schreibt, und die dann wieder ausliest. Eure Beispiele sind nur für eine Klasse / eine Struktur oder eine Variable. Ich möchte diese nicht schlecht machen, aber für ein Spiel bringt einem das nix. Dort hat man Werte von DirectInput, DirectSound, Direct3D, dazu noch Spielvariablen und mehr - die alle in eine Klasse zu packen ist purer Selbstmord.

Ob man nun in Cpp mit Streams oder mit FILE* arbeitet ist total wurscht, es kommt darauf was man lieber macht, an der stream Variante gefällt mit z.B. der char Pointer nicht, und deshalb hab ich auch C genommen. Wenn ihr das gleiche Programm in Cpp mit streams schreiber würdet, würdet ihr merken das es unter Umständen sogar mehr wird ;).

@DarkRage
Wenn schon Cpp, dann aber richtig.... und nicht sprintf verwenden ;)
sondern auch mit strings arbeiten, vorzugsweise mit unicode :)

Werbeanzeige