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

Rion

Frischling

  • »Rion« ist der Autor dieses Themas

Beiträge: 23

Wohnort: Trier

Beruf: Komponist, Medienassistent

  • Private Nachricht senden

1

10.09.2010, 10:52

Variable in Datei speichern

Hallo Leute,

habe eine Frage bezüglich des Speicherns von Variablen in einer Datei mit SFML. Irgendwie klappt das nicht so ganz. Hier mal mein Quellcode:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//Header-Dateien
...

int main()
{
    //Variablen
    string str;

//Quellcode für Namenseingabe
...

    //Datenstrom (Name speichern)
    ofstream Output ("data/core.std", ios::binary);
    Output.write ((char*) str, sizeof (str));
    Output.close();
}


Es geht halt darum, dass der Spielername des Spielers (den er eingeben kann) in der Datei "core.std" gespeichert wird. Aber folgender Fehler tritt auf:

"error C2440: 'Typumwandlung': 'std::string' kann nicht in 'char *' konvertiert werden.
Kein benutzerdefinierter Konvertierungsoperator verfügbar, der diese Konvertierung durchführen kann, oder der Operator kann nicht aufgerufen werden."

Habe auch schon ohne casten versucht, dann steht da sowas wie "Typ char erwartet". Wie kann ich also eine String-Variable in eine Datei speichern?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

10.09.2010, 11:04

Dein Problem ist dass dir offenbar nicht ganz klar ist was ein string ist. std::string ist nur eine Klasse. Dein string Objekt enthält im Prinzip nur einen Pointer auf ein char Array. Selbst wenn du nun den korrekten Weg gefunden hättest um ein string Objekt in die Datei zu schreiben würde das nicht das von dir gewünschte Ergebnis liefern. Denn dein string Objekt enthält ja nur einen Pointer auf den eigentlichen String. Was du also tun würdest ist die Adresse deines String in die Datei schreiben und nicht den String selbst. Spätestens beim nächsten Programmstart ist diese Adresse dann sowieso ungültig und dein Programm wird crashen wenn du versuchst den string zu laden und dann zu verwenden. Lösung: Nicht das string Objekt in die Datei schreiben sonden den eigentlichen String. Entweder z.B. als nullterminiertes Zeichenarray oder als Länge (int) gefolgt von Zeichenarray.

hanse

Alter Hase

Beiträge: 472

Wohnort: Wien

  • Private Nachricht senden

3

10.09.2010, 11:28

und wenn du an diesen String (bzw. das nullterminierte char array) kommen willst gibt es die funktion c_str():
http://www.cplusplus.com/reference/string/string/c_str/

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

4

10.09.2010, 11:51

...und wenn du andere Variablen und Objekte schreiben, bzw. lesen willst, die keine Zeiger auf Objekte im Heap enthalten musst du reinterpret_cast<char *> benutzen.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

10.09.2010, 11:54

...und wenn du andere Variablen und Objekte schreiben, bzw. lesen willst, die keine Zeiger auf Objekte im Heap enthalten musst du reinterpret_cast<char *> benutzen.

Was er da oben im Prinzip tut, der Grund warum es nicht "funktioniert" ist dass sein str kein Pointer ist ;)

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

6

10.09.2010, 12:17

der Grund warum es nicht "funktioniert" ist dass sein str kein Pointer ist


Ja, das ist mir klar, dieses Problem hatte ich auch mal.

Aber macht es wirklich keinen Unterschied reinterpret_cast oder (char*)() zu nehmen? Wenn nein, zu was braucht man reinterpret_cast dann?

Rion

Frischling

  • »Rion« ist der Autor dieses Themas

Beiträge: 23

Wohnort: Trier

Beruf: Komponist, Medienassistent

  • Private Nachricht senden

7

10.09.2010, 12:20

Vielen Dank für eure Antworten. Bin halt noch C++-Anfänger. Programm speichert nun die Variable :)
Das Auslesen funktioniert auf die gleiche Weise (mit strcpy).

Danke!!

Rion

Frischling

  • »Rion« ist der Autor dieses Themas

Beiträge: 23

Wohnort: Trier

Beruf: Komponist, Medienassistent

  • Private Nachricht senden

8

10.09.2010, 12:23

der Grund warum es nicht "funktioniert" ist dass sein str kein Pointer ist


Ja, das ist mir klar, dieses Problem hatte ich auch mal.

Aber macht es wirklich keinen Unterschied reinterpret_cast oder (char*)() zu nehmen? Wenn nein, zu was braucht man reinterpret_cast dann?
Soweit ich weiß, wandelt reinterpret_cast ja Pointer eines Datentyps in einen Pointer eines anderen Datentyps um (z.B. char* in int*). Es soll aber sehr unsicher sein. Auch MSDN empfiehlt die Verwendung anderer cast-Operatoren.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

10.09.2010, 12:26

Aber macht es wirklich keinen Unterschied reinterpret_cast oder (char*)() zu nehmen? Wenn nein, zu was braucht man reinterpret_cast dann?

Worauf ich hinauswollte: Ein C-Style Cast bedeutet in C++ einfach nur dass C++ casts in einer definierten Reihenfolge durchprobiert und der erste der funktioniert genommen wird. In seinem Fall hätte das reinterpret_cast bedeutet. In gutem C++ Code verwendet man niemals C-Style Casts sondern die entsprechenden C++ casts.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

10.09.2010, 12:32

Soweit ich weiß, wandelt reinterpret_cast ja Pointer eines Datentyps in einen Pointer eines anderen Datentyps um (z.B. char* in int*). Es soll aber sehr unsicher sein. Auch MSDN empfiehlt die Verwendung anderer cast-Operatoren.

Richtig, reinterpret_cast castet im Prinzip nicht verwandte Pointertypen oder Pointer in Integer Typen und umgekehrt. Praktisch das einzige was bei einem reinterpret_cast garantiert ist ist: Wenn du einen blub* in einen (ausreichend großen) integer castest und diesen integer (unverändert) wieder zurück in einen blub* dann zeigt der Pointer immer noch auf das selbe blub Objekt. Praktisch alles andere ist plattformabhängig (implementation defined). reinterpret_cast ist nur dann zu benutzen wenn man sich vollkommen bewusst ist was man damit tut und warum. reinterpret_cast braucht man normalerweise auch nur sehr selten. read und write auf streams zählt vielleicht zu den Stellen wo man am häufigsten auf einen reinterpret_cast treffen wird da er hier früher oder später praktisch notwendig wird (man könnte einen direkten reinterpret_cast natürlich auf bestimmten Wegen umgehen, was im Endeffekt aber keinen wirklichen Unterschied macht).

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »dot« (10.09.2010, 12:45)


Werbeanzeige