Lesen von Binär Dateien
-
1. Wie genau liest du die Datei ein und zeigst sie an? Womöglich ist dort ein NULL-Byte dazwischen, das die Kontollausgabe beendet.
2. Klar kannst du auch die binären Daten lesen, wenn du Text dort reingeschrieben hast. In einer Binärdatei stehen genauso char's wie in einer Textdatei.
(der einzige Unterschied zwischen den Dateimodi ist die Art, wie Newlines behandelt werden - Binärdateien überlesen sie ohne Sonderbehandlung, Textdateien passen sie ans Betriebssystem an (Windows verwendet \r\n, C++ übersetzt das in ein einfaches \n)).
PS@Mods: Warum steht das eigentlich noch nicht in den FAQs? So oft wie diese Frage in letzter Zeit kam.
-
Hallo,
Hinweis für Strings:
Wenn man Strings binär rausschreibt sollte man vorher dort die Länge mit ablegen, sonst weiß man beim späteren Einlesen dann nicht wieviele Bytes gelesen werden sollen.
etwa so// rausschreiben int size = name1.length(); FileIn.write( (char*)size, sizeof(size)); FileIn.write( (char*)name1.c_str(), name1.length())); //einlesen int size; FileIn.read( (char*)size, sizeof(size)); char* buffer = new char[size+1]; FileIn.read( buffer, size); buffer[size] = '\0'; name1 = buffer; delete[] buffer;
-
hallo,
meine Funktionen read() und write() sehen jetzt so aus:void Write() { cls(); string name; string name1; setCursor(10,1); cout << "Bitte geben Sie den Pfad an, wo die Datei gespeichert\nwerden soll (z.B. c:\\Hallo.bin): "; cin >> name; ofstream FileIn(name.c_str(),ios::out|ios::binary); if( !FileIn) { openError(); } cls(); cout << "Bitte geben sie nun den Text ein der der Datei hinzugefuegt\nwerden soll: "; cin >> name1; int size = name1.length(); FileIn.write( (char*)size, sizeof(size)); if( !FileIn.write( name1.c_str(), name1.length())) { writeError(); } cls(); FileIn.close(); cout << "Vielen Dank!\n Die Datei ist nun unter '" << name << "' gespeichert!\n Auf Wiedersehen!"; } void Read() { cls(); string name; setCursor(10,1); cout << "Bitte geben sie den Pfad zu der Datei an die sie lesen moechten: "; cin >> name; cls(); ifstream FileOut(name.c_str(),ios::in|ios::binary); if( !FileOut) { openError(); } else { int size; FileOut.read( (char*)size, sizeof(size)); char* buffer = new char[size+1]; FileOut.read( buffer, size); buffer[size] = '\0'; name = buffer; delete[] buffer; }Aber beim schreiben wird das Programm einfach nachdem ich angegeben habe was in die Datei geschrieben werden soll angegeben habe beendet, wieder mit dieser "Fehler in Der Anwendung" fehlermeldung -> Die Anweisung "0x00435dd9" ... blabla.
??
-
Geh doch mal mit dem Debugger durch und schau wo abgebrochen wird. Desweiteren wirst du beim einlesen mit cin Schwierigkeiten bei Trennzeichen (Leerzeichen oder so) bekommen, da dann hier abgebrochen wird. Nimm lieber getline.
-
getline(cin, name1);richtig?
ok habs durch den debugger laufen lassen aber er zeigt keine fehlermeldungen an...
-
Das mit dem getline ist richtig.
Wenn dein Programm abbricht, muß es doch auch im Debugger abbrechen. Es ist halt wichtig herauszubekommen wo der Fehler auftritt. Ich sehe in deinem Code erstmal keine Fehler.
-
FileOut.write((char*)size,sizeof(size));Da ist ein kleiner, aber dezenter Fehler drin - du interpretierst den Wert von "size" als Adresse der Daten, die du schreiben willst - da ist ein SegFault sehr wahrscheinlich. (und selbst wenn du diese Adresse lesen kannst, steht bestimmt nicht das richtige drin ;))
Richtig müsste es heißen:
FileOut.write(&size,sizeof(size));(PS: Bei der Read()-Funktion hast du den selben Fehler)
-
Ok, war auch mein Fehler. Korrekt müsste es wohl so heißen
FileOut.write((char*)&size,sizeof(size));Der cast ist schon notwendig.
oder noch besserFileOut.write(reinterpret_cast<const char*>(&size),sizeof(size));[edit]const noch eingefügt[/edit]
-
OK! Danke!
Jetzt bricht er nicht mehr ab, aber jetzt habe ich wieder ein neues problem^^(sieht so aus als könnte das nie enden...
) Das Programm überspringt einfach den Teil wo etwas in die Datei geschrieben werden soll. 
EDIT: Kann man eigentlich den text formatieren so das er z.B. rechtsbündig geschrieben wird oder das mal nach einer bestimmten Anzahl von Zeichen ein newline gemacht wird??
-
Weiß keiner was?(sry für doppelpost)
-
Bei dem Code hilft nur noch die Entfickler-Taste. Zuerst Strg + A und dann entfrickeln mit Entf.
-
Nochmal. Geh mit dem Debugger durch und schau was passiert.
Bezüglich rechtsbündig. Wohin willst du denn rechtsbündig ausgeben, in eine Datei? Das geht nicht.