Binärdateien erstellen - geht das?
-
Hallo Zusammen,
ich habe aktuell ein Problem mit dem erstellen von dBAse Datenbanken (s.h. http://www.c-plusplus.net/forum/278529). Jetzt habe ich mir überlegt, dass man die Datenbank ja auch "manuell" anlegen kann. Den aufbau des dBase-Headers habe ich schon gefunden.Meine Frage ist jetzt, kann ich mit dem BCB auch Binärdateien erstellen? Also Dateien mit Hex-Wert?
-
Hallo
Selbstverständlich geht das, siehe TFileStream oder std::fstream.
bis bald
akari
-
Moin,
ok. Das habe ich mir angschaut. Komme aber irgendwie nicht weiter. Verstehe nicht wie das mit TFileStream funktioniert.Ich möchte genau genommen eine dBase Datei erstellen. Also den Header selber schreiben. Dann Daten aus einer .csv Datei einlesen und in die dBase Datei schreiben. Wie kann ich das jetzt am besten anstellen?
Gibt es für TFileSteam irgendwo ein kleines Tutorial?
Stehe aktuell etwas aufm schlauch.
-
Hallo
Alles was du brauchst steht in der Builder-Referenz.
TFileStream* Datei = new TFileStream("Datei.dat", fmCreate); String y = "Hallo"; Datei->Write(y.c_str(), y.Length()); int x = 10; Datei->Write(&x, sizeof(int)); delete Datei;
bis bald
akari
-
Moin,
schau doch mal in der Hilfe nach.
Die Memberfunktion Write schreibt aus einem Puffer die angegebene Anzahl von Bytes.Write(const void *Buffer, int Count);
Ich nehme mal an, dass Du den Header für die dBase Datei in einer Struktur speicherst bzw. erstellst. Dann solle es so klappen
// Struktur Deines db Headers struct TMYDBheader { ...; ...; } // und wegschreiben TMYDBheader dbheader; TFileStream *dbfile = new TFileStream("mydb.dbf", fmCreate); dbFile->Write(&dbheader, sizeof(TMyDBheader)); delete dbfile; // untested...
Viele Grüße
Pixfreak
PS: @akari: da haben wir uns überlappt...
-
Hallo
@Pixfreak : Aber darauf achten : direktes binäres Schreiben von structs/classes funktioniert nur dann korrekt, wenn das struct nur PODs und keine Zeiger oder Referenzen auf andere Instanzen beinhaltet. Das bedeutet schon ein String oder ein char* als Member macht eine extra Behandlung für jeden Member notwendig.
bis bald
akari
-
Deswegen würde ich auch vorschlagen der struct read/write-Methoden zu verpassen die das dann übernehmen.
-
akari schrieb:
Hallo
@Pixfreak : Aber darauf achten : direktes binäres Schreiben von structs/classes funktioniert nur dann korrekt, wenn das struct nur PODs und keine Zeiger oder Referenzen auf andere Instanzen beinhaltet. Das bedeutet schon ein String oder ein char* als Member macht eine extra Behandlung für jeden Member notwendig.
akari
Volle Zustimmung. Ich hab den dBase Header nicht gerade vor den Augen, aber da sind doch auch entsprechende Vorgaben und Parameterlängen vorhanden. Daher fällt ja wohl ein dynamischer String, Zeiger etc. aus.
Vielleicht wie schon vorgeschlagen dann eine eigene Klasse basteln, die den Header und die Daten korrekt schreibt, aber mit den dynamischen Typen nicht kolidiert. Aber dann kann ich ja gleich langsam aber sicher auf die alte BDE etc. zurück greifen (ok, ich geh in Deckung...)
VG Pixfreak