Binäres Datei schreiben/lesen
-
Hallo!
Ich wollte mir eine kleine Datenbank schreiben, die die Daten in einem File speichert und sie dann bei Programmstart läd. Da ich gerne die Datei verschlüsseln will (um auch die binären Schreib-/ Lesevorgänge mal zu lernen), wollte ich das gleich auf binärer Ebene machen.
Dazu habe ich ein bisschen Code zum Probieren erstmal, allerdings bekomme ich eine eigenartige Ausgabe, die für mich keinen Sinn ergibt.
#include <iostream> #include <fstream> using namespace std; fstream iof; struct Test { // Daten in einer struct zusammengefasst char a[10], b[10], c[10]; }; int main() { iof.open("bla.asdf", ios::in|ios::out|ios::binary); Test test; for(int i=0;i<10;++i) { test.a[i] = 'a'; test.b[i] = 'b'; test.c[i] = 'c'; } iof.write(reinterpret_cast<char*>(&test), sizeof(test)); // schreiben cout << test.a << endl << test.b << endl << test.c << endl << endl; iof.seekg(0); iof.read(reinterpret_cast<char*>(&test), sizeof(test)); // direkt wieder auslesen cout << test.a << endl << test.b << endl << test.c << endl; iof.close(); system("pause"); return 0; }http://imgur.com/Jau3nX4
Das ist die Ausgabe.Im File selber steht:
"aaaaaaaaaabbbbbbbbbbcccccccccc"Ich könnte mir vorstellen, dass ich etwas mit den C-Strings falsch mache, damit arbeite ich eigentlich nicht, allerdings muss ich es hier, damit in die Daten in der struct zusammenfassen und speichern kann.
Ich hoffe jemand von euch hat eine Idee woran es liegen könnte,
Danke!!
-
Schamote schrieb:
Ich könnte mir vorstellen, dass ich etwas mit den C-Strings falsch mache, damit arbeite ich eigentlich nicht, allerdings muss ich es hier, damit in die Daten in der struct zusammenfassen und speichern kann.
Cout gibt den C-String so lange aus, bis ein 0-Byte kommt. Bei dir fehlt das aber, deshalb wird beliebig viel Müll ausgegeben.
Setze am Anfang
test.a[9] = test.b[9] = test.c[9] = 0.Ausserdem ist "ich möchte binär Lesen/Schreiben" kein Grund,
fstream iof;global zu machen. Wenn du den in main deklarierst, kannst du sogar auf das close() verzichten.
-
Keine Nullterminierung der C-Strings.
Bei der Ausgabe wird alles bis zur ersten Null ausgegeben.
Und wenn du etwas verschlüsselt haben willst, musst du es auch verschlüsseln und nciht einfach nur binär speichern! Der Windowseditor interpretiert die Daten binär und due wirst keine große Änderung haben.
-
Keine Nullterminierung der C-Strings.
Bei der Ausgabe wird alles bis zur ersten Null ausgegeben.Ok, danke, wusste ich es doch

Und wenn du etwas verschlüsselt haben willst, musst du es auch verschlüsseln und nciht einfach nur binär speichern! Der Windowseditor interpretiert die Daten binär und due wirst keine große Änderung haben.
Ich weiß, dass das noch nicht verschlüsselt ist, wollte es nur anmerken, nicht, dass jemand mit dem <<-Operator kommt

-
Schamote schrieb:
Und wenn du etwas verschlüsselt haben willst, musst du es auch verschlüsseln und nciht einfach nur binär speichern! Der Windowseditor interpretiert die Daten binär und due wirst keine große Änderung haben.
Ich weiß, dass das noch nicht verschlüsselt ist, wollte es nur anmerken, nicht, dass jemand mit dem <<-Operator kommt

Mit dem wunderbar verschlüsselt ausgeben kann.
-
Nathan schrieb:
Schamote schrieb:
Und wenn du etwas verschlüsselt haben willst, musst du es auch verschlüsseln und nciht einfach nur binär speichern! Der Windowseditor interpretiert die Daten binär und due wirst keine große Änderung haben.
Ich weiß, dass das noch nicht verschlüsselt ist, wollte es nur anmerken, nicht, dass jemand mit dem <<-Operator kommt

Mit dem wunderbar verschlüsselt ausgeben kann.
Ich bin für neues immer offen.
-
http://www.c-plusplus.net/forum/p2228469#2228469
Damit erschlägt man sämtliche Ausgabefunktionen mit einem Streich.
Kann natürlich auch leicht auf eine nicht-knackbare Verschlüsselung angepasst werden. Das XOR wird bloß benutzt, weil das in dem anderen Thread gesucht war.
-
Verdammt, ich war auch grad dabei einen encrypted_streambuf zu schreiben.

-
Nathan schrieb:
Verdammt, ich war auch grad dabei einen encrypted_streambuf zu schreiben.

Dann mach Version 2.0, die das ganze blockweise an eine Kryptobibliothek weitergibt, anstatt eine solch primitive, zeichenweise Verschlüsselung zu benutzen. Also analog zu den gzstreams für Kompression:
http://www.cs.unc.edu/Research/compgeom/gzstream/Das Ergebnis wäre dann wohl sogar eine Veröffentlichung wert, sofern es das noch nicht geben sollte.
-
Wollte eigentlich den Streambuf als Templateargument übergeben, von dem dann abgeleitet wird und dann die Basclass-Functions aufgerufen werden, aber dein Design fand ich dann doch besser.
-
Ich bin äußerst verwirrt!
Ich habe jetzt mit meinem eigentlichen Projekt wietergemacht, allerdings habe ich wieder einen Fehler, sodass ich wieder auf mein reduziertes Projekt gewechselt habe, um das Problem zu finden.Erstmal der Code:
#include <iostream> #include <fstream> using namespace std; struct SPerson { char vorname[25]; char name[15]; char email[25]; char telefon[16]; char adresse[18]; char stufe[14]; }; int main() { fstream iof("bla.asdf", ios::in|ios::out|ios::binary); SPerson person; for(int i=0;i<24;++i) //Pseudodaten schreiben person.vorname[i] = 'a'; person.vorname[24] = 0; for(int i=0;i<14;++i) person.name[i] = 'b'; person.name[14] = 0; for(int i=0;i<24;++i) person.email[i] = 'c'; person.email[24] = 0; for(int i=0;i<15;++i) person.telefon[i] = 'd'; person.telefon[15] = 0; for(int i=0;i<17;++i) person.adresse[i] = 'e'; person.adresse[17] = 0; for(int i=0;i<13;++i) person.stufe[i] = 'f'; person.stufe[13] = 0; cout << "\n" << sizeof(SPerson) << "\n"; iof.write(reinterpret_cast<char*>(&person), sizeof(SPerson)); cout << person.vorname << "\n" // die geschriebenen Daten << person.name << "\n" << person.email << "\n" << person.telefon << "\n" << person.adresse << "\n" << person.stufe << "\n\n" ; SPerson person2; iof.seekg(0); iof.read(reinterpret_cast<char*>(&person2), sizeof(SPerson)); cout << person2.vorname << "\n" // die gelesenen Daten << person2.name << "\n" << person2.email << "\n" << person2.telefon << "\n" << person2.adresse << "\n" << person2.stufe << "\n\n" ; system("pause"); return 0; }Im Konsolenfenster sind immer die zu erwartenden Daten zu sehen ("aa...bb..ff..").
Im File allerdings finde ich je nach Konstellation der Struct manchmal den Klartext und manchmal eigenartige Schriftzeichen.
Und es wechselt, wenn ich die Chararrays länger bzw. kürzer mache.
So wie es jetzt ist, funktioniert es, aber wenn ich allerdings das Array "Stufe" um 1 kürzer mache, kommen wieder eigenartige Schritzeichen dabei raus.Könnte es sein, dass die Struct eine gewisse Länge haben muss?
So sind es jetzt 113 Bytes.
-
Schreib einfach normal.
Nicht binär.
Verschlüsseln kannst du dann auch.