Dateioperationen, ofstream, Integerwerte speichern
-
@Zothac übergib
write()
einen (char
) pointer auf das erste Byte des Wertes den Du schreiben willst und als size die Anzahl an Bytes die der zu schreibende Typ breit ist. Lesen analog mitread()
.
-
@Zothac sagte in Dateioperationen, ofstream, Integerwerte speichern:
da diese Funktion laut Referenz den Datentyp "const char" als Parameter erwartet
Ist der * durch die Formatierung verloren gegangen oder hast du ihn nicht gesehen/verstanden?
Es ist
const char*
-
Mit
const char* s
ist in diesem Fall nicht nur String gemeint. C++ unterscheidet hier nicht zwischenchar
und "byte" (wie andere Sprachen ;-).
Du kannst also, so wie @Swordfish schon geschrieben hat, einfach einen Zeiger auf einen beliebigen Datentyp übergeben, z.B.int x = 42; file.write(&x, sizeof(int));
Die Datei dann aber im Binary-Modus benutzen (zumindestens unter Windows relevant).
PS: Mit put schreibst du nur ein einzelnes
char
, d.h. wenn in deinemint
-Array größere Werte als -128 bis 127 stehen, dann wird nur das niederwertige Byte weggeschrieben (wegen "promotion").
-
Dazu müsste ich einen Zeiger vom Typ char auf eine Integer-Variable zeigen lassen. Das führt zur Fehlermeldung.
int value1 = 12345; char *ptr1; ptr1 = &value1;
Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand Fehler (aktiv) E0513 Ein Wert vom Typ ""int *"" kann keiner Entität vom Typ ""char *"" zugewiesen werden. ArrayTest D:\Programmierung\Cpp\ArrayTest\ArrayTest\ArrayTest.cpp 126
-
Du musst schon casten:
char *ptr1 = reinterpret_cast<char*>(&value1)
-
@Th69 sagte in Dateioperationen, ofstream, Integerwerte speichern:
file.write(&x, sizeof(int));
Besser wäre imho
file.write(&x, sizeof(x));
Weil man da den Typ von x nicht unbedingt wissen muss.
-
Ich weiß, daß andere es so machen, aber ich bevorzuge die explizite Typangabe, denn ich habe schon solchen Code gesehen:
const char *s = "..."; file.write(s, sizeof(s)); // weil da anscheinend nur per C&P Code erstellt wurde
Und bei Einsetzen des Typen sollte einem Auffallen, daß das so nicht funktioniert (zumindestens, wenn man den String ganz ausgeben will, und nicht nur die ersten 4/8/... Zeichen ;-).
Außerdem habe ich auch die Typumwandlung oben vergessen:
int x = 42; file.write(reinterpret_cast<const char *>(&x), sizeof(int)); // sizeof(x)
-
Danke schön. In Basic war das alles etwas einfacher...
-
Da gibt es ja auch keine Zeiger!
-
@Zothac Das wofür es fertige Funktionen in BASIC gibt ist meist in BASIC einfacher. Das wofür es keine fertigen Funktionen gibt ist dafür oft in C++ einfacher.
-
@hustbaer oder deutlich schneller
@Th69 Jain... zumindest bei Pure Basic gibt es auch Zeiger. Da musste man sich allerdings wenig Gedanken um Datentypen machen. Es gibt da sog. "Types" welche mit Objekten vergleichbar sind. Da konnte man auch Zeiger auf einzelne Objekte setzen.