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

R3sident3vil

Treue Seele

  • »R3sident3vil« ist der Autor dieses Themas

Beiträge: 177

Wohnort: 1010010

Beruf: Selbstständig

  • Private Nachricht senden

1

25.02.2007, 19:54

Save-Dateien speichern

Guten Tag Herrschaften,

ich machs kurz, ich sitze gerad noch an einem Win32-Konsolen-Game. Eine Kleinigkeit fehlt. Das Speichern eines Charakters in eine Save-Datei der ich einen bestimmten Namen über die Konsole geben kann, und genauso mit dem Loaden. Ich weiß nur wie ich die Eingaben bzw. Variablen unter einem immer konstanten Namen speichern kann, und loaden. Wie in dem Fall 'character.sav'.


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
...
...
...

void Speichern(void)
{
  ofstream Save ("Saves\\character.sav", ios::binary); // konst. Name

  cout << endl;
  Console::attribute(FOREGROUND_GREEN);
  cout << "Save of '" << name << "'...\n";
  Sleep (2000);
  Save.write ((char*) &name, sizeof (name));
  Console::attribute(FOREGROUND_RED);
  cout << "Done.\n";
  cout << endl;
  Console::attribute(FOREGROUND_GREEN);
  cout << "Save of '" << fname << "'...\n";
  Sleep (2000);
  Save.write ((char*) &fname, sizeof (fname));
  Console::attribute(FOREGROUND_RED);
  cout << "Done.\n";
  cout << endl;
  Console::attribute(FOREGROUND_GREEN);
  cout << "Save of '" << rasse << "'...\n";
  Sleep (2000);
  Save.write((char*) &rasse, sizeof (rasse));
  Console::attribute(FOREGROUND_RED);
  cout << "Done.\n";
  cout << endl;
  Console::attribute(FOREGROUND_GREEN);
  cout << "Save of '" << alter << "'...\n";
  Save.write ((char*) &alter, sizeof (alter));
  Sleep (2000);
  Console::attribute(FOREGROUND_RED);
  cout << "Done.\n";
  // Datei schließen

  Save.close ();
  cout << "Save-Process has been completed! \1  \2 \n";
  Sleep (2000);
  cout << endl;
  Console::attribute(FOREGROUND_INTENSITY);
  cout << endl;
  Hauptprogramm ();
}

void Laden(void)
{
  Console::attribute(FOREGROUND_INTENSITY);
  cout << "Load 'character.sav' ...\n";
  ifstream Load ("Saves\\character.sav", ios::binary);
  Load.read ((char*) &name, sizeof (name));
  Load.read ((char*) &fname, sizeof (fname));
  Load.read ((char*) &rasse, sizeof (rasse));
  Load.read ((char*) &alter, sizeof (alter));
  Load.close ();
  NebenprogrammC ();
}


Aber wenn man mehrere Charaktere erstellt dann gibts ein Problem... ;-)
Ich hab es so versucht, um der Savedatei einen Namen zu geben, und beim Laden diesen Namen auch aufzurufen:

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
...
...
char dateiname[256];

...
...

void Speichern(void)
{
  cout << "Unter welchem Namen möchtest du deine Charakterinfos speichern? : ";
  cin >> dateiname;
  ofstream Save ("Saves\\"dateiname &&".sav", ios::binary);
  cout << endl;                //^^ Geht nich, wie mach ich das?

  Console::attribute(FOREGROUND_GREEN);
  cout << "Save of '" << name << "'...\n";
  Sleep (2000);
  Save.write ((char*) &name, sizeof (name));
  Console::attribute(FOREGROUND_RED);
  cout << "Done.\n";
  cout << endl;
  Console::attribute(FOREGROUND_GREEN);
  cout << "Save of '" << fname << "'...\n";
  Sleep (2000);
  Save.write ((char*) &fname, sizeof (fname));
  Console::attribute(FOREGROUND_RED);
  cout << "Done.\n";
  cout << endl;
  Console::attribute(FOREGROUND_GREEN);
  cout << "Save of '" << rasse << "'...\n";
  Sleep (2000);
  Save.write((char*) &rasse, sizeof (rasse));
  Console::attribute(FOREGROUND_RED);
  cout << "Done.\n";
  cout << endl;
  Console::attribute(FOREGROUND_GREEN);
  cout << "Save of '" << alter << "'...\n";
  Save.write ((char*) &alter, sizeof (alter));
  Sleep (2000);
  Console::attribute(FOREGROUND_RED);
  cout << "Done.\n";
  // Datei schließen

  Save.close ();
  cout << "Save-Process has been completed! \1  \2 \n";
  Sleep (2000);
  cout << endl;
  Console::attribute(FOREGROUND_INTENSITY);
  cout << endl;
  Hauptprogramm ();
}

void Laden(void)
{
  Console::attribute(FOREGROUND_INTENSITY);
  cout << "Gib den Namen der Save-Datei ein :";
  cin >> dateiname;
  cout << "Load '" << dateiname << ".sav' ...\n";
  ifstream Load ("Saves\\" dateiname &&".sav", ios::binary);
                                       //^^ Geht auch nich

  Load.read ((char*) &name, sizeof (name));
  Load.read ((char*) &fname, sizeof (fname));
  Load.read ((char*) &rasse, sizeof (rasse));
  Load.read ((char*) &alter, sizeof (alter));
  Load.close ();
  NebenprogrammC ();
}


Nun, angenommen ihr habt mein Anlegen verstanden. Könntet ihr mir weiterhelfen? Es geht nur darum wie ich die Save-Datei eines erstellten Charakters selbst benennen bzw. aufrufen kann =) :roll:

Danke im Voraus :idea:
Kaum ist Linux wieder da, schon gehts meinem Rechner wunderbar, denn Linux ist die beste Medezin.

Olischewsky Arts

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

2

25.02.2007, 20:07

Ich würde dir an der stelle dringend zu std::string raten - ist wesentlich besser zu handhaben

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
    std::string dateiname;
    // name einlesen

    std::cin >> dateiname;
    // Ordner vorne anfügen

    dateiname.insert(0, "Saves\\");
    // falls der Nutzer die Endung .sav noch nicht angefügt hat anfügen

    if (! (dateiname.substr(dateiname.length()-4)==".sav"))
    {
        dateiname.append(".sav");
    }
    std::ofstream datei(dateiname, std::ios::binary);

R3sident3vil

Treue Seele

  • »R3sident3vil« ist der Autor dieses Themas

Beiträge: 177

Wohnort: 1010010

Beruf: Selbstständig

  • Private Nachricht senden

3

25.02.2007, 20:32

Welche Header muss ich für 'insert' inkludieren? Mein Compiler sagt mir, dass 'insert' ein undefinierte Symbol ist. d.h. liegt es wohl an der fehlenden Header :arrow:
Kaum ist Linux wieder da, schon gehts meinem Rechner wunderbar, denn Linux ist die beste Medezin.

Olischewsky Arts

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

4

25.02.2007, 20:37

Also wenn er std::string problemlos annimmt muss er auch dessen methode insert kennen. poste mal deinen code.

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

5

25.02.2007, 21:44

kurz geantwortet:

C-/C++-Quelltext

1
#include <string>

R3sident3vil

Treue Seele

  • »R3sident3vil« ist der Autor dieses Themas

Beiträge: 177

Wohnort: 1010010

Beruf: Selbstständig

  • Private Nachricht senden

6

25.02.2007, 21:53

Nun ich habs so gemacht wie ich es verstanden habe. Es klappt in der Tat nicht. NICHT mit std::string. Mein Compiler bevorzugt lieber char.
Aber wenn ichs mit char mache dann kennt er nur noch 'insert' nicht

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
void Speichern(void)
{
  cout << "Unter welchem Namen moechtest du deine Charakterinforamtionen speichern? :";
  std::cin >> dateiname;
  dateiname.insert(0, "Saves\\");
  if (! (dateiname.substr(dateiname.length()-4)==".sav"))
  {
    dateiname.append(".sav");
  }
  ofstream Save (dateiname, std::ios::binary);
  Save.write ((char*) &name, sizeof (name));
  Save.write ((char*) &fname, sizeof (fname));
  Save.write((char*) &rasse, sizeof (rasse));
  Save.write ((char*) &alter, sizeof (alter));
  Save.close ();
  cout << "Save-Process has been completed! \1  \2 \n";
  Sleep (2000);
  cout << endl;
  Hauptprogramm ();
}

void Laden(void)
{
  Console::attribute(FOREGROUND_INTENSITY);
  cout << "Gib den Namen deines Saves ein, den du laden willst:";
  std::cin >> dateiname;
  cout << "Load '" << dateiname << "' ...\n";
  dateiname.insert("Saves\\");
  ifstream Load (dateiname, std::ios::binary);
  Load.read ((char*) &name, sizeof (name));
  Load.read ((char*) &fname, sizeof (fname));
  Load.read ((char*) &rasse, sizeof (rasse));
  Load.read ((char*) &alter, sizeof (alter));
  Load.close ();
  NebenprogrammC ();
}
Kaum ist Linux wieder da, schon gehts meinem Rechner wunderbar, denn Linux ist die beste Medezin.

Olischewsky Arts

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

7

25.02.2007, 22:00

Logisch, weil ein Zeiger auf char keine Methode insert hat, die gehört zu std::string. Willst du also insert benutzen, musst du mit std::string arbeiten, und das geht, wie grek schon gesagt hat, wenn du <string> inkludierst.

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

8

25.02.2007, 22:01

Das is auch blödsinn... char ist ein Datentyp - da is nix mit insert und std::string ist eine typedef auf std::basic_string<char>. std::basic_string ist eine Template-Klasse die unter anderem die Methode insert zur Verfügung stellt.
Wenn es mit std::string nicht klappt dann poste lieber den Code und gib ne Fehlermeldung dazu anstatt zu behaupten der Compiler würde irgendwas bevorzugen^^

// zu spät^^

was mir grad noch auffällt... ich hab oben nen kleinen Fehler:

C-/C++-Quelltext

1
std::ofstream Save(dateiname.c_str(), std::ios::binary);

ist richtig.

Sheddex

unregistriert

9

25.02.2007, 22:05

C-/C++-Quelltext

1
2
3
4
5
char Buffer[256];

sprintf_s(Buffer, 256, "Saves\\%s", dateiname);

//Hier zum Laden den Buffer benutzen

R3sident3vil

Treue Seele

  • »R3sident3vil« ist der Autor dieses Themas

Beiträge: 177

Wohnort: 1010010

Beruf: Selbstständig

  • Private Nachricht senden

10

25.02.2007, 22:12

Wie gesagt, ich machs mal konkret so wie ihr es gesagt habt ;-)

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
...
...
#include <string.h>
...
...

void Speichern(void)
{
  cout << "Unter welchem Namen moechtest du deine Charakterinforamtionen speichern? :";
  std::string dateiname; 
  // name einlesen

  std::cin >> dateiname;
  // Ordner vorne anfügen

  dateiname.insert(0, "Saves\\");
  // falls der Nutzer die Endung .sav noch nicht angefügt hat anfügen

  if (! (dateiname.substr(dateiname.length()-4)==".sav"))
  {
    dateiname.append(".sav"); 
  }
  std::ofstream Save(dateiname, std::ios::binary);
  Save.write ((char*) &name, sizeof (name));
  Save.write ((char*) &fname, sizeof (fname));
  Save.write((char*) &rasse, sizeof (rasse));
  Save.write ((char*) &alter, sizeof (alter));
  Save.close ();
  cout << "Save-Process has been completed! \1  \2 \n";
  Sleep (2000);
  cout << endl;
  Hauptprogramm ();
}

void Laden(void)
{
  Console::attribute(FOREGROUND_INTENSITY);
  cout << "Gib den Namen deines Saves ein, den du laden willst:";
  std::cin >> dateiname;
  cout << "Load '" << dateiname << "' ...\n";
  dateiname.insert("Saves\\");
  ifstream Load (dateiname, std::ios::binary);
  Load.read ((char*) &name, sizeof (name));
  Load.read ((char*) &fname, sizeof (fname));
  Load.read ((char*) &rasse, sizeof (rasse));
  Load.read ((char*) &alter, sizeof (alter));
  Load.close ();
  NebenprogrammC ();
}

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


Die Fehlermeldungen:

Quellcode

1
2
3
4
Erzeugen
  [C++ Fehler] Personal.cpp(150): E2285 Keine Übereinstimmung für 'ofstream::basic_ofstream(string,enum)' gefunden
  [C++ Fehler] Personal.cpp(168): E2285 Keine Übereinstimmung für 'string::insert(char *)' gefunden
  [C++ Fehler] Personal.cpp(169): E2285 Keine Übereinstimmung für 'ifstream::basic_ifstream(string,enum)' gefunden
Kaum ist Linux wieder da, schon gehts meinem Rechner wunderbar, denn Linux ist die beste Medezin.

Olischewsky Arts

Werbeanzeige