Union mit float Problem
-
Hi,
Wie kann ich in einer Datei Float-Werte abspeichern? Ich möchte gern, dass die Floats in ein *char "übersetzt" wird und so direkt ins File geschrieben wird. Muss ich das im Binary-Mode machen?
Ich bin für jede Hilfe dankbar
Hier mein Code:
#include <iostream> #include <fstream> using namespace std; union trans { float f; char c[sizeof(float)]; }; void write_float2file(char *path, trans *t) { fstream datei; datei.open(path, ios::out | ios::app); //Zum schreiben oeffnen, anhaengen cout << sizeof(float) << endl; if(!datei) cout << "Datei kann nicht geoeffnet werden!" << endl; else { datei << t->c; } datei.close(); } void read_file2float(char *path) { fstream datei; datei.open(path, ios::in); //Zum lesen oeffnen trans temp; int i = 0; if(!datei) cout << "Datei kann nicht geoeffnet werden!" << endl; else { do { datei.get(temp.c, sizeof(float)); //groesse eines Floats einlesen cout << temp.f << endl; }while(!datei.eof()); } datei.close(); } int main() { trans transfer; transfer.f = 12345.789; cout << "Float betraegt: " << transfer.f << endl; cout << "Float unformatiert in Datei abspeichern..." << endl; write_float2file("C:\\bla\\float.txt", &transfer); transfer.f = 9876.2458; //Ein zweiter Float abspeichern write_float2file("C:\\bla\\float.txt", &transfer); cout << "Float unformatiert aus Datei lesen..." << endl; read_file2float("C:\\bla\\float.txt"); //Alle Float in der Datei auslesen return 0; }
-
Ist zwar ne ANSI-C Lösung, aber hauptsache es funktioniert
char hilf[10]; float zahl=1.234567; sprintf(hilf, "%f", zahl);
Nun steht in hilf die Zeichenfolge 1.234567 drin
-
Danke für den Tipp, aber ich möchte schon gern wissen was ich falsch gemacht habe mit dem Union. Es muss mit dem Union genau so klappen
-
\0
Mehr brauch ich wohl nicht zu sagen, oder?
-
warum so kompliziert wenn es auch einfach und besser (portabler) geht?
#include <fstream> #include <iostream> void write(float f) { std::ofstream out("flout.f"); out << f; } void read(float &f) { std::ifstream out("flout.f"); out >> f; } int main() { float f0=1.2345; write(f0); float f1; read(f1); std::cout << f0 << " == " << f1 << " : " << (f0==f1) << std::endl; }
-
Danke für eure Tipps
Dieser Code den ich hier geschrieben habe, kommt in kein Programm. Es geht mir rein ums Verständnis.
AJ schrieb:
\0
Mehr brauch ich wohl nicht zu sagen, oder?
Wo hab ich den das \0 vergessen?
Wäre wirklich Super, wenn mir jemand meinen Fehler mit mitteilt
-
Wo hab ich den das \0 vergessen?
na in deiner union.
Angenommen ein float hat vier Byte, dann ist dein char-Feld eine Größe von vier, die alle komplett belegt werden, ohne \0, was ein fünftes Byte belegen würde.
Außerdem macht die ganze union-Geschichte nicht so wirklich Sinn. Wenn du tatsächlich eine binäre Darstellung erreichen möchtest, öffne die Datei im Binärmodus.
-
Danke
Das EOS hab doch wirklich völlig vergessen.
Jetzt kann ich schonmal den ersten Wert auslesen. Aber die folgenden Wert wolle einfach nicht richtig angezeigt werden. Ich schätzmal das bei read_file2float() ein Bug drin ist.Kann mir diesbetzüglich jemand vielleicht noch helfen?
const char path[] = "C:\\bla\\float.txt"; union trans { float f; char c[sizeof(float)+1]; //:D }; void write_float2file(trans *t) { fstream datei; datei.open(path, ios::out | ios::app); //Zum schreiben oeffnen, anhaengen if(!datei) cout << "Datei kann nicht geoeffnet werden!" << endl; else { datei << t->c; } datei.close(); } void read_file2float() { fstream datei; datei.open(path, ios::in); //Zum lesen oeffnen trans temp; int i = 0; if(!datei) cout << "Datei kann nicht geoeffnet werden!" << endl; else { while(datei.get(temp.c, sizeof(float)+8)) { cout << temp.f << endl; } } datei.close(); } int main() { fstream datei; datei.open(path, ios::out | ios::trunc); //Datei Inhalt loeschen datei.close(); trans transfer; transfer.f = 12345.789; cout << "Float unformatiert in Datei abspeichern..." << endl; write_float2file(&transfer, 0); transfer.f = 9876.456; //Ein zweiter Float abspeichern write_float2file(&transfer, 1); transfer.f = 147876.5555; //Ein zweiter Float abspeichern write_float2file(&transfer, 2); transfer.f = 5476.4434; //Ein dritte Float abspeichern write_float2file(&transfer, 2); cout << "Float unformatiert aus Datei lesen..." << endl; read_file2float(); //Alle Float in der Datei auslesen return 0; }
-
Hab den Fehler nach einer 2 Stündigen Pause gefunden
Ich muss das File natürlich Binär öffnen.Trotzdem, danke für eure Hilfe
-
Und das beste ist, das du dir dann die Mühe mit der Union sparen kannst und einfach
stream << floatinpoint_objekt;
schreiben kannst.