PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Variablen-Werte in Textdatei schreiben? [c++]



Ynnus
29.11.2004, 01:17
Hallöchen,

ich befasse mich gerade in C++ mit Streams, genauer gesagt mit Filehandling. Dabei soll also etwa der Text "Hallo" in eine Datei geschrieben werden. Alles kein Problem, über Arrays, Pointer oder sonstwas. Auch einzelne Character lassen sich abspeichern. Nur bei anderen Werten wie Long-Variablen oder Integer speichert er mir immer den Wert als Zahlenfolge und nicht als 4 Byte für die Long-Variable. Beispiel:

#include <iostream.h>
#include <fstream.h>

int main()
{
long variable = 2329193;
ofstream file("test.txt");

file<<variable;

cin.get();
return 0;
}
In die Datei wird jetzt folgendes geschrieben: "2329193"
Dabei soll da eigentlich der zugehörige 4-Byte Wert drinne stehn. In diesem Fall also "iŠ# "

Wie bekomm ich den Compiler dazu, nicht den Wert der Variable als Zeichenfolge in die Datei zu schreiben sondern die korrekten 4 Byte welche für diesen Wert benötigt werden? Denn wenn er den Wert als Zeichenfolge schreibt, schreibt er ja ganz andere Byte in die Datei. Nämlich die ASCII-Werte für die Ziffern 2,3,2,9,1,9,3. Und diese sind ja anders als die ASCII-Werte für den Inhalt der Variablen.
Muss ich davor erstmal den Zahlenwert in Charas wandeln (etwa per Char-Array) und dann einzeln als Char schreiben, dann wären es die korrekten Byte-Werte, oder gibt es da einfachere Wege? Etwa ein forgefertigter Befehl welcher die automatisch macht oder sowas?
Tutorialstechnisch hab ich bisher nur Beispiele gefunden welche Texte in Datein schreiben und das klappt ja soweit auch ganz gut. Nur bei Variablen macht er eine Ausnahme und schreibt die Werte anstelle der Byte.
Vielleicht hat auch noch jemand eine Methode diese Werte wieder korrekt auszulesen? Dass man per Funktion sagt, direkt in eine Long-Variable auslesen, dass er dann auch 4 Stellen in der Datei ausließt und deren Wert in die Long-Datei schreibt. Gibt es dafür Funktionen oder weiß jemand wie das zu machen wär? Vielleicht normal als Char-Array auslesen und per "Cast" in eine Long-Variable wandeln?

mfg.

Sunny

Master of Disaster
29.11.2004, 01:37
http://courses.cs.vt.edu/~cs2604/fall04/SM/binio.html

Dingsi
29.11.2004, 12:03
Zuallerst muss der Filestream als ios::binary geöffnet werden. Also ofstream file("test.txt",ios::binary);. Zweitens brigt dir jetzt der <<Operator nichts mehr, da diesser immer formatierte Werte schreibt. Man muss.. äh.. file.write() nehmen. Als zweiten Parameter muss die sizeof(long) angeben. Der erste Parameter muss ein char-Pointer zu dem Kram sein den du schreiben willst. Ich bin mir nicht ganz sicher, aber ich denke das sollte sich einfach zu casten sein. (char*)variable. Im Endeffekt also:

#include <iostream.h>
#include <fstream.h>

int main()
{
long variable = 2329193;
ofstream file("test.txt",ios::binary);

file.write((char*)variable,sizeof(long));

/*
Sollte das nicht gehen, versuch mal das long als nen Pointer zu machen. Also:

long* variable = new long;
*variable = 2329193;
file.write((char*)variable,sizeof(long));
delete variable;
*/

cin.get();
return 0;
}

Ynnus
29.11.2004, 16:24
Dank' euch Beiden. ;)
Der Link ist schonmal sehr gut, werd ich mir nachher mal genauer ansehen. Ansonsten geht es auch so wie die 2te (Einkommentierte) Methode von dir, Dingsi. (In Methode 1 gibts übrigends ein Speicherfehler bei mir. ;))


Zuallerst muss der Filestream als ios::binary geöffnet werden
Wenn ich es ohne mache geht es auch. Was für eine Bedeutung hat denn die Mode binary?

Dingsi
29.11.2004, 17:04
Ah. Anstatt (char*)variable muss man (char*)&variable machen. Dann sollte es auch ohne das anderen Pointer-Speicher-Gedöhns gehen.
Wenn ich es ohne mache geht es auch. Was für eine Bedeutung hat denn die Mode binary?Mmh... es kann sein, dass der Mode nur unter Unix-artigen gesetzt werden muss. Auf jedenfall sagt er aus, das mit Binärdaten anstatt Textdaten gearbeitet werden soll. Also dass man mit rohen Datentypen arbeiten will.

Mein Ava ist viel hübscher als deina. o__o.

Ynnus
29.11.2004, 17:37
Mein Ava ist viel hübscher als deina. o__o.
Das mag sein, Frauen halte ich sowieso für das schönere Geschlecht, da kann ich schonmal nicht mithalten. Aber dein Avatar entspricht nicht deiner Person, zumindest nicht dem Typen den ich auf der Nato getroffen habe. :D

Dafür kann dein Avatar hier nicht mehr mithalten: :D
http://www.thecelebzone.com/reese_witherspoon/reese_witherspoon_018.jpg
http://www.thecelebzone.com/reese_witherspoon/reese_witherspoon_020.jpg
Oder hier:
http://gamera.unas.cz/pix_celebs/denise_richards_3.jpg
http://users2.ev1.net/~jemhadar/images/maelstroms_eye/me931-denise_richards_024.jpg

Ineluki
29.11.2004, 22:02
spamm0rs

this->close(*this);