binärdatei struktur
-
Mit "binär" meint was was anderes, als Du da machst. Du hast nur eine Text-Datei, die ist nicht "binär" im Sinne von ios::binary.
Statt ios_base::out oder ios_base::in bitte ifstream oder ofstream statt fstream nehmen. Und nicht open/close benutzen. Dafür gibt es Konstruktor und Destruktor.
Dein Speichern ist norlames Abspeichern als Text. Übrigens ist die Anzahl am Anfang keine so gute Idee, genauso wie die Texte in [].
Ich gehe malö davon aus, Du willst viele Zahlen speichern. Sagen wir mal bis 1Mrd.
Bis dahin gibt es ca. 1Mrd/ln(1Mrd)=48.25Mio Primzahlen, mit je ca 9 Ziffern und einem Trennzeichen sind ca 483Mio Bytes.
"Binär" speichern könnte man zum Beispiel per write(&zahl,sizeof(zahl)) und brächte genau 4 Bytes pro Zahl, zusammen nur 193Mio Bytes.
Oder man speichert für jede Zahl ein Bit, eine 1 für jede Primzahl, eine 0 für anständige Zahlen. Dann braucht man 1Mrd Bit, ist 125Mio Bytes.Überraschenderweise sind nicht nur die Größen recht ähnlich, sondern sie bleiben für jedes bei 0 beginnende Intervall so ähnlich, denn genau so stark, wie sich die Primzahlen ausdünnen, nimmt auch der Mehrbedarf durch ein längeres Zahlenformat zu.
Übrigens ist das Berechnen von Primzahlen bei Bedarf schneller, als das Lesen von Platte.
-
wenn ich es so mache benutze ich doch ifstresm und ofstream:
ofstream myfile; myfile.open ("example.bin", ios::out | ios::app | ios::binary);das mit dem 0 und 1 versteh ich nicht so ganz, woher weiß ich denn welche zahl gemeint ist??
-
1 2 3 4 5 6 7 8 9 10 11 ... 0 1 1 0 1 0 1 0 0 0 1 ...
-
ok, danke
-
wenn ich aber so meinen quellcode habe:
#include <iostream> #include <fstream> using namespace std; int main() { ofstream dat_aus; string dateiname = "binary-datei.prim"; dat_aus.open(dateiname.c_str(), ios_base::out | ios_base::binary); dat_aus << "Test Test Test"; dat_aus.close(); return 0; }wird meine datei wie eine textdatei angezeigt und geöffnet (wenn ich das sage), daher meine frage, warum ist dann bei anderen dateien irgendwelche zeichen?
-
Ich glaube du hast einen entscheidenen Denkfehler...
Sag mir einmal, wie sich eine Binärdatei für dich definiert?(a)sie hat die Endung .bin oder ähnliche Binärkürzel
(b)man beschreibt sie mit einem ios::binary Zusatz in der open-Anweisung
(c)wenn man eine "echte" Binärdatei öffnet, sieht man nur komische Zeichen, die keiner lesen kann
(d)man kann alles lesen, es sind aber nur Blöcke aus Binärzahlen da (0111011)
(e)deine eigene InterpretationBitte zutreffendes ankreuzen

Wenn das geklärt ist, kann ich dir vllt weiterhelfen

-
mir ist schon klar, dass alle dateien am computer binärdateien sind und es auf die interpretierweise ankommt. punkt c trifft da am meisten zu.
wie kann man das machen, das es so eine ausgabe gibt, praktisch das man nur mit dem eigenen programm die datei lesen kann.
-
Du hast für ein Byte 256 Möglichkeiten [0,255].
Das komische Assehen von Binärdateien Im Editor kommt daher zu Stande, dass viele Bytes <32 oder >127 sind.
-
Dann sprichst du also hier eine Art Fake-Verschlüsslung an...
Wenn du das erreichen willst, dass keiner deine Datei von außen mit einem Texteditor lesen kann, mach es so wie ich^^XOR-Verschlüssung ist so genial wie simple...Man kann den Text mit demselben Schlüssel ver- und entschlüsseln... Dabei entsteht ein unlesebarer Text...
Verschlüsslung ist allerdings sehr leicht zu knacken
Also nicth für PW´s verwenden...Ist nur fürs Aussehen...//Hier sind mal meine Versuche dazu //Habe sie bereits erfolgreich getestet ifstream leseDatei ("output.txt", ios::binary); ofstream schreibeDatei("test.txt", ios::binary); string Schluessel; cout <<"Bitte Schluessel eingeben: " ; getline(cin,Schluessel); int SchluesselLaenge=Schluessel.size(); char x; int i=0; while(leseDatei.get(x)) { schreibeDatei.put(x ^ Schluessel[i]); i++; if(i>=SchluesselLaenge)i=0; }Hoffe ich konnte helfen

-
das heißt, der texteditor versucht immer byteweise einzulesen??
-
Schau dir doch mal eine ASCII-Tabelle an.
Ab 32 (Leerzeichen) bis 126 haben wir Zeichen, die wir als Text lesen können. Über 126 sinds dann noch Diakritika und sonstige Zeichen.
In anderen Ländern reicht diese 1 Byte-Codierung nicht aus (Stichwort UNICODE).
-
das heit, ich schreib in meinen quelltext ein ~ schreibe hat das eine eigene bedeutung oder | usw.
dient dies dazu, das dateien von programmen nicht von jeden richtig interpretiert werden können??
-
Gucky schrieb:
wenn ich es so mache benutze ich doch ifstresm und ofstream:
ofstream myfile; myfile.open ("example.bin", ios::out | ios::app | ios::binary);Ja, aber warum nicht das moderne
ofstream myfile("example.bin", ios::app | ios::binary);[/quote]
?
-
ok, jetzt das modernere
kann mir trotzdem jemand sagen, warum man das so kompliziert macht (z.B. bei *.3ds so dargestellt wird)??