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

22.12.2011, 19:16

Danke, das funktioniert soweit und das programm wirft auch keinen Fehler mehr aus, aber wenn ich Dateien jetzt auslese bekomme ich nur unleserlichen Binärsalat. Ich habe alle Variablen einer Flotte in dieselbe Datei geschrieben. So sieht eine meiner write () Funktionen aus

C-/C++-Quelltext

1
OSave.write ((char*) &pFleet[p+1].activated, sizeof (pFleet[p+1].activated));


Und so eine entsprechende read ()

C-/C++-Quelltext

1
ILoad.read ((char*) &pFleet[p+1].activated, sizeof (pFleet[p+1].activated));

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

12

22.12.2011, 19:23

Wenn du binäre Daten in eine Datei schreibst ist das doch klar;) Ist aber doch auch so gewollt oder nicht. Klappt jetzt alles?

edit: Was du machst ist ein C-Cast. Genau den sollst du ja nicht benutzen. Wenn du C++ und casting in die Suchmaschine deiner Wahl eintippst, solltest du genug dazu finden.
Und warum machst du &pFleet? Damit bekommst du doch eine Adresse. Was Char-Pointer sollen ist dir schon klar oder?
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

13

22.12.2011, 20:09

Und warum machst du &pFleet? Damit bekommst du doch eine Adresse. Was Char-Pointer sollen ist dir schon klar oder?
Ist es Dir denn klar? ;)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

14

22.12.2011, 20:09

DANKE Schorsch, die Binärverschlüsselung hat den Ausschlag gegeben. Jetzt macht mein Programm, das was es sollte :D . Das mit pFleet hat mich auch irritiert, aber BlueCobold meinte, dass es so funktioniert und das tut es. Ich finde es nur bemerkenswert, dass ihr beide die Lösung aus dem Buch dieser Seite ablehnt. Wie auch immer Danke für eure Hilfe, ihr habt mir stundenlange Forensuchen erspart :) !!

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

15

22.12.2011, 22:08

Damit ist ein C-String gemeint. Nur warum holt er die Adresse? Mein C++ ist ganz schön eingerostet merk ich grad;) Aber sollte ein normaler Cast der Value auf char* nicht genügen? Vielleicht hab ich auch einfach grad ein Brett vorm Kopf.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

16

23.12.2011, 08:47

Ich glaube dann gebe ich Dir der Einfachheit halber einen Link: http://www.cplusplus.com/reference/iostream/ostream/write/
So viel sei verraten: Es geht nicht um Strings.

Einen Int oder Short in einen Char* zu casten ist übrigens absolut keine gute Idee.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

17

23.12.2011, 12:27

Na gut C-String war vielleicht ein schlechter Ausdruck. Ich meinte wohl eher ein Char-Array, was das ganze ja nun darstellt. Wie gesagt mein C++ ist ganz schön eingerostet aber genug gerechtfertigt. Das Problem wurde ja gelöst;)
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

18

26.11.2012, 15:25

Mehrere Integer mittels <fstream> in Datei schreiben

Hey Leute, bin neu hier im Forum und habe eine Problem, das glaube ich am ehesten hier rein passt, allerdings habe ich das Problem
noch nicht mit den vorherigen Posts lösen können. Also ich versuche gerade eine Highscore in das Spiel aus dem Buch "C++ für Spieleprogrammierer"
einzubauen, dafür habe ich eine Klasse CHighscore die jedesmal wenn ein Asteroid getroffen wurde +1 zu der Membervariable "int Points" dazuaddiert.
Die wird dann, wenn man selber getroffen wird und das Spiel beendet wird in eine Datei geschrieben. Das klappt auch alles soweit, aber wenn ich
aus dem Menü heraus(was ich hinzugefügt habe) eine neue Instanz von CHighscore erzeuge um mir dann die Highscore ausgeben zu lassen. Dazu
lese ich die erreichten Punkte wieder aus der Datei heraus und vergleiche sie mit 3 weiteren Variablen für die ersten 3 Plätze, die auch in die Datei
geschrieben werden sollen. Dann wird verglichen ob eben die neuen Punkte für einen der ersten 3 Plätze reicht oder eben nicht, aber irgendwie
werden nur die Punkte richtig ausgelesen und wieder reingeschrieben, nicht aber die Variablen für die Platzierung.

Wäre cool wenn ihr da eine Idee hättet, hierzu gleich mal der Code

Liebe Grüße Jaschade

Quellcode

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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
// ShowHighscore
//
// Aufgabe: Die Highscore im Menü ausgeben
//
void CHighscore::ShowHighscore ()
{


 
      // Variable zum Speichern der Erreichten Punkte
      int Points = 0;
      int FirstPlace = 0;
      int SecondPlace = 0;
      int ThirdPlace = 0;


     //////////////////////////////////
     // Datei öffnen zum Auslesen der Erreichten Punkte
     ifstream RankingInput ("Ranking.fuck", ios::binary);

    if(RankingInput == NULL)
    {
             cout << "Datei konnte nicht zum Lesen geöffnet werden. \n";
    }
    else
    {

            // Erreichte Punkte in Variabalen Points speichern
           RankingInput.read (reinterpret_cast(&Points), sizeof(Points));
           RankingInput.read (reinterpret_cast(&FirstPlace), sizeof(FirstPlace));
           RankingInput.read (reinterpret_cast(&SecondPlace), sizeof(SecondPlace));
           RankingInput.read (reinterpret_cast(&ThirdPlace), sizeof(ThirdPlace));

     }

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


 
 
    ///////////////////////
    // Neuer dritter Platz?
    if (Points > ThirdPlace && Points <= SecondPlace)
   {
          ThirdPlace = Points;

   }


    ///////////////////////    // Neuer zweiter Platz?
    if (Points > SecondPlace && Points <= FirstPlace)
    {
           ThirdPlace = SecondPlace;
           SecondPlace = Points;
    } 


    //////////////////////
    // Neuer erster Platz?
    if (Points > FirstPlace)
   {
          ThirdPlace = SecondPlace;
          SecondPlace = FirstPlace;
          FirstPlace = Points;
    }

 

     cout << "Points: " << Points << "\n";
     cout << "1.Platz: " << FirstPlace << " Punkte \n";
     cout << "2.Platz: " << SecondPlace << " Punkte \n";
     cout << "3.Platz: " << ThirdPlace << " Punkte \n\n";
    

     // Points zurücksetzen
     Points = 0;


     ////////////////////////////////////
     // Ranglisten-Datei zum Schreiben öffnen
     ofstream RankingOutput ("Ranking.fuck", ios::binary);

     if(RankingOutput == NULL) 
     {
             cout << "Datei konnte nicht zum Schreiben geöffnet werden.\n";
     }
     else
    {

            // Variablen der Highscore-Instanz in Datei schreiben
            RankingOutput.write (reinterpret_cast(&FirstPlace), sizeof(FirstPlace));
            RankingOutput.write (reinterpret_cast(&SecondPlace), sizeof(SecondPlace));
            RankingOutput.write (reinterpret_cast(&ThirdPlace), sizeof(ThirdPlace));

            // Erreichte Punkte in Variabalen Points speichern
            RankingOutput.write (reinterpret_cast(&Points), sizeof (Points));

     }

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


} // ShowHighscore




P.S. die Abfrage mit den Plätzen ist verkehrt, aber darum gehts mir gerade nicht :)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

19

27.11.2012, 07:20

Du weißt aber, dass zu zuerst Points liest und danach die Places, aber es beim Schreiben genau andersherum machst?

Da wundert mich die Aussage etwas, dass die Punkte angeblich stimmen, aber die Plätze nicht. Da dürfte gar nichts stimmen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

20

27.11.2012, 11:52

Argh, daran hab ich Heini garnicht erst gedacht, dass man die Werte so in die Datei schreiben muss wie man sie auch ausgelesen haben will. Das hat zu Zahlendrehern geführt und der erste Platz ist irgendwie immer verloren gegangen und die restlichen konnten dann nicht richtig angepasst werden, vorallem aber auch, weil ich beim Speichern der erreichten Punktzahl in einer anderen Funktion nur die Punkte in die Datei reinschreiben wollte und nicht die Platzierungen zusätzlich nochmal (obwohl sich da nichts ändern solllte), also lass ich da alle Variablen zuerst nochmal auslesen, ändere dann lediglich die Punkte
und schreibe wieder alles in die Datei rein und siehe da, es funktioniert!

Danke für die schnelle Antwort, die Motivation ist aufjedenfall wieder gestiegen ;)

Werbeanzeige