Dateigröße von Binär- und Ascii-Dateien
-
Hallo,
um ein double-Feld in eine Datei zu schreiben, bin ich am Überlegen, ob ich die Daten binär oder ascii schreiben soll. Dazu habe ich ein Testprogramm geschrieben, was meiner Meinung schon mal das richtige tut. Ich schreibe ein Double-Feld sowohl in eine binär- als auch in eine ascii-Datei. Mir ist dabei aufgefallen, dass die binär-Datei größer ist als die ascii-Datei. Ich kenne das so, dass binäre Dateien kleiner sind als die entsprechende ascii-Version.
#include <iostream> #include <fstream> using namespace std; int main () { // double field int dim = 1000; double* field = new double[dim]; for (int i=0; i<dim; ++i) field[i] = i; // write binary file fstream out; out.open("numbers.bin", ios::out | ios::binary); out.write((char *) field, dim*sizeof(double)); out.close(); // write ascii file out.open("numbers.asc", ios::out); for (int i=0; i<dim; ++i) out << field[i]; out.close(); // clear array for(int i=0; i<dim; i++) field[i] = 0.0; // read file fstream in; in.open("numbers.bin", ios::in | ios::binary); in.read((char *) field, dim*sizeof(double)); cout << in.gcount() << " bytes read\n"; in.close(); // show values read from file for(int i=0; i<dim; i++) cout << field[i] << "\t"; cout << endl; delete field; return 0; }
Hmmm...
Ich habe schon viel im Netz nachgeschaut und wurde dabei nicht fündig. Habt ihr eine gute Referenz?
Grüße, K.B.
-
Das liegt daran das deine Ascii-Doubles so viele Bytes einnehmen, wie sie Stellen haben. Also maximal 4. Binär immer 4. Daher ist das Binary größer. Nimm andere Zahlen, keine Ganzen. Dann merkst den Unterschied. Und ein Space dazwischen bei ASCII wäre praktisch.
-
Nun ja einen double-Wert zu speichern benötigt pro Wert 4 Byte. Bei den von Dir gewählten Werten sind keine Nachkommstellen vorhanden und somit kommst Du bei den Werten von 0 bis 9 mit einem Byte in der ASCII-Version aus, bei den werten von 10 bis 99 mit 2 Byte usw...
Prinzipiell ist Deine Vermutung also richtig, nur die Testwere sind ungünstig gewählt (da ohne Nachkommaanteil und nur bis zur maximalen Größe von 1000).
[Edit] Mal wieder zu langsam...
-
Bei mir sieht die Ascii-Datei so aus:
0123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999
Man sieht, dass für die 1 nur genau eine 1 in der Datei steht. Das ist bei mir 1 byte. selbst die 999 ist noch kleiner als 4 byte.
Klar dass bei diesen bedingeungen die ASCII Datei kleiner ist, ändert sich aber, wenn du genaue Werte die nicht so rund aufgehen haben willst (und versuch mal deine numbers.asc zu lesen)
-
Hi,
vielen Dank für eure schnellen Antworten! Ich hab also dementsprechend vor dem Schreiben der Ascii-Datei setprecision(16) gesetzt und statt ganzzahliger Werte nun Kommazahlen mit vielen Stellen schreiben lassen. Und siehe da ... die Ascii-Datei ist größer als die Bin-Datei.
Tschö,
K.B.
-
Joe_M. schrieb:
Nun ja einen double-Wert zu speichern benötigt pro Wert 4 Byte.
Also bei mir ist sizeof(double) = 8
-
Dann hast du vermutlich ein 64bit-System...
-
Nein, witte hat völlig recht, Fehler meinerseits. double hat 8 Byte.