vector<bool> in Datei schreiben und aus Datei lesen
Hallo, ich habe schaffe es irgendwie nicht einen vector<bool> in eine Datei zu schreiben und danach wieder einzulesen. --- snip --- FILE *fp = fopen( file.c_str(), "wb" ); vector<bool> rand_bits; // rand_bits mit 1000 Bits füllen this->generate( rand_bits, 100, 1000 ); size_t nmemb = rand_bits.size()/8; if( ( rand_bits.size() - (nmemb*8) ) > 0 ) { nmemb++; } vector<bool>::const_iterator rand_bits_i = rand_bits.begin(); fwrite( &rand_bits_i, 1, nmemb, fp ); fclose( fp ); --- snap --- --- snip --- rand_bits.resize( n_bits ); size_t len = 0; size_t read_len = n_bits/8; vector<bool>::const_iterator rand_bits_i = rand_bits.begin(); len = fread( &rand_bits_i, sizeof( uint8_t ), read_len, rand_file ); if( read_len != len ) { return len; } if( (read_len*8) < n_bits ) { rand_bits_i += read_len; len += fread( &rand_bits_i, sizeof( uint8_t ), read_len, rand_file ); } --- snap --- Das Schreiben in die Datei scheint zu klappen, nur leider sind nicht wirklich die Daten in der Datei die ich erwartet hätte. Beim Lesen sieht es verheerend aus: Es gibt einen Speicherzugriffsfehler :-( Ich bin über jede Hilfe dankbar. Viele Grüße Bastian
On Monday 20 October 2003 13:34, Bastian Schern wrote:
ich habe schaffe es irgendwie nicht einen vector<bool> in eine Datei zu schreiben und danach wieder einzulesen.
Probier's mal mit "cout" und "operator<<()".
CU
--
Stefan Hundhammer
Stefan Hundhammer schrieb:
On Monday 20 October 2003 13:34, Bastian Schern wrote:
ich habe schaffe es irgendwie nicht einen vector<bool> in eine Datei zu schreiben und danach wieder einzulesen.
Probier's mal mit "cout" und "operator<<()".
Sorry, das verstehe ich jetzt nicht. Wie kann ich mit cout in eine Datei schreiben?
On Monday 20 October 2003 14:18, Bastian Schern wrote:
Probier's mal mit "cout" und "operator<<()".
Sorry, das verstehe ich jetzt nicht. Wie kann ich mit cout in eine Datei schreiben?
Sorry, mißverständlich ausgedrückt - natürlich ofstream und nicht cout.
Siehe auch
http://www.cplusplus.com/doc/tutorial/tut6-1.html
Du wirst mit einem Iterator über den Vektor gehen müssen und jedes Element mit
"<<" ins File ausgeben.
CU
--
Stefan Hundhammer
Stefan Hundhammer schrieb: [...]
Sorry, mißverständlich ausgedrückt - natürlich ofstream und nicht cout.
Siehe auch
http://www.cplusplus.com/doc/tutorial/tut6-1.html
Du wirst mit einem Iterator über den Vektor gehen müssen und jedes Element mit "<<" ins File ausgeben.
Habe ich jetzt mal folgendermaßen probiert:
vector<bool> rand_bits;
this->generate( rand_bits, n, N );
ofstream o_file( file.c_str(), ios::out|ios::trunc|ios::binary );
if( !o_file ) {
perror( "ofstream" );
exit( 1 );
}
o_file << n << N << rng_seed;
for( size_t i=0; i
On Monday 20 October 2003 16:47, Bastian Schern wrote:
Leider sind in der Datei dann nicht die bool-Werte, sondern der ASCII-Code von "0" oder "1".
Eben als Repräsentant für einen booleschen Wert; warum auch nicht 0 und 1? Willst Du unbedingt genau die Bits ins File schreiben? Das ist eine ganz andere Anwendung; dann mußt Du Dir erst einmal über Bit- und Byte-Reihenfolge klar werden. Das schafft einen ganzen Sack neuer Probleme. Eben deshalb verwendet die STL hier wohl 0 und 1.
Mit 'nem Iterator funktioniert es überhaupt nicht.
?! Das wundert mich. Na ja, egal, Du mußt mit einer Schleife über alle Werte;
das geht so, wie Du es gemacht hast, ja auch sehr gut.
CU
--
Stefan Hundhammer
Stefan Hundhammer schrieb:
On Monday 20 October 2003 16:47, Bastian Schern wrote:
Leider sind in der Datei dann nicht die bool-Werte, sondern der ASCII-Code von "0" oder "1".
Eben als Repräsentant für einen booleschen Wert; warum auch nicht 0 und 1?
Willst Du unbedingt genau die Bits ins File schreiben? Das ist eine ganz andere Anwendung; dann mußt Du Dir erst einmal über Bit- und Byte-Reihenfolge klar werden. Das schafft einen ganzen Sack neuer Probleme. Eben deshalb verwendet die STL hier wohl 0 und 1.
Ich wollte schon gerne den genau die Bits in ein File schreiben. Sonst bräuchte ich ja 8 mal so viel Platz. Das sind bei ca. 100 MB dann schon 800 MB. Die Reihenfolge spielt nicht eine so große Rolle, da ich das File in der gleichen Reihenfolge wieder auslese. Viele Grüße Bastian
On Monday 20 October 2003 17:11, Bastian Schern wrote:
Ich wollte schon gerne den genau die Bits in ein File schreiben. Sonst bräuchte ich ja 8 mal so viel Platz. Das sind bei ca. 100 MB dann schon 800 MB. Die Reihenfolge spielt nicht eine so große Rolle, da ich das File in der gleichen Reihenfolge wieder auslese.
Wenn Du ein bißchen mehr über die Anwendung verrätst und natürlich die zu
erwartende Datenmenge, wird es ein bißchen einfacher, Hilfestellung zu
geben. ;-)
Sind das Meßdaten?
Ist es ein kontinuierlicher Datenstrom?
Welche Art der Verarbeitung soll damit irgendwann erfolgen?
Ist wahlfreier Zugriff ( lseek() ) auf Bitebene wichtig?
CU
--
Stefan Hundhammer
Stefan Hundhammer schrieb:
On Monday 20 October 2003 17:11, Bastian Schern wrote:
Ich wollte schon gerne den genau die Bits in ein File schreiben. Sonst bräuchte ich ja 8 mal so viel Platz. Das sind bei ca. 100 MB dann schon 800 MB. Die Reihenfolge spielt nicht eine so große Rolle, da ich das File in der gleichen Reihenfolge wieder auslese.
Wenn Du ein bißchen mehr über die Anwendung verrätst und natürlich die zu erwartende Datenmenge, wird es ein bißchen einfacher, Hilfestellung zu geben. ;-)
Jedes Bit in dem File repräsentiert eine Randomzahl. Beispiel: Ich benötige z.B. 2 Zahlen zwischen 0 und 7, dann erhalte vielleicht 2 und 5. Dazu setze ich jetzt einfach Bit 2 und 5 in meinem Bitset auf true und erhalte somit 001001000. Man könnte sich jetzt natürlich auch einfach 2 und 5 in einem vector<int> merken, dafür benötige ich dann aber schon 2*4 Byte Platz. In der Praxis werden es wahrscheinlich 100*10^6 Zufallszahlen sein. Also ca. 100MB im Bitset bzw. 3,2GB im Vector. Das macht dann schon einen erheblichen Unterschied. Ein Bitweises Seeken ist nicht nötig. Es wird höchstens am Ende schwierig, wenn 1 bis 7 Bytes übrig sind. Da ich mir allerdings noch ca. 1000 dieser Files anlegen möchte kann ich nicht mal die 100 MB im Speicher halten. Ich habe mir dann gedacht, dass ich dann immer jeweils nur 1000 Byte aus einem Bitset im Speicher behalte und die Bitsetfiles dann sequentiell in 1000 Byte-Schritten abarbeite. Viele Grüße Bastian
On Monday 20 October 2003 17:42, Bastian Schern wrote:
Jedes Bit in dem File repräsentiert eine Randomzahl. Beispiel: Ich benötige z.B. 2 Zahlen zwischen 0 und 7, dann erhalte vielleicht 2 und 5. Dazu setze ich jetzt einfach Bit 2 und 5 in meinem Bitset auf true und erhalte somit 001001000. Man könnte sich jetzt natürlich auch einfach 2 und 5 in einem vector<int> merken, dafür benötige ich dann aber schon 2*4 Byte Platz. In der Praxis werden es wahrscheinlich 100*10^6 Zufallszahlen sein. Also ca. 100MB im Bitset bzw. 3,2GB im Vector. Das macht dann schon einen erheblichen Unterschied. Ein Bitweises Seeken ist nicht nötig. Es wird höchstens am Ende schwierig, wenn 1 bis 7 Bytes übrig sind. Da ich mir allerdings noch ca. 1000 dieser Files anlegen möchte kann ich nicht mal die 100 MB im Speicher halten. Ich habe mir dann gedacht, dass ich dann immer jeweils nur 1000 Byte aus einem Bitset im Speicher behalte und die Bitsetfiles dann sequentiell in 1000 Byte-Schritten abarbeite.
Na gut, das ist dann natürlich schon eine sehr spezielle Anwendung; dafür ist
die Standard-Serialisierung ( operator<<( bool ) ) wohl wirklich denkbar
ungeeignet - und dafür ist sie wohl auch nicht gedacht.
Dafür würde ich mir dann wirklich eine spezielle Funktion gönnen, die diese
Bits gepackt wegschreibt.
Ich bin mir aber ziemlich sicher, daß <bitset> genau das kann - und für Deine
Anwendung auch viel geeigneter ist, weil auch im Speicher jedes Bit nur ein
Bit und nicht wie bei vector<bool> ein Byte braucht. auch operator<<() ist
dort hoffentlich effizienter implementiert.
"bool" ist für einzelne Flags gedacht, nicht für große Mengen; genau dafür
gibt es <bitset>. Mehr Info hier:
http://cplus.about.com/library/weekly/aa042203j.htm
http://www.josuttis.com/libbook/cont/bitset1.cpp.h
CU
--
Stefan Hundhammer
Stefan Hundhammer schrieb:
On Monday 20 October 2003 17:42, Bastian Schern wrote:
[...]
Na gut, das ist dann natürlich schon eine sehr spezielle Anwendung; dafür ist die Standard-Serialisierung ( operator<<( bool ) ) wohl wirklich denkbar ungeeignet - und dafür ist sie wohl auch nicht gedacht.
Dafür würde ich mir dann wirklich eine spezielle Funktion gönnen, die diese Bits gepackt wegschreibt.
Ich bin mir aber ziemlich sicher, daß <bitset> genau das kann - und für Deine Anwendung auch viel geeigneter ist, weil auch im Speicher jedes Bit nur ein Bit und nicht wie bei vector<bool> ein Byte braucht. auch operator<<() ist dort hoffentlich effizienter implementiert.
Wenn ich das im [Stroustrup, Die C++ Programmiersprache] richtig
verstanden habe, belegt ein Element von vector<bool> genau ein Bit.
Ansonsten denke ich aber, dass Du vollkommen recht hast und die Klasse
dafür ungeeignet ist.
Allerdings habe ich mit dem <bitset> so meine Probleme. Ich habe mir
gedacht das es so funktioniert, leider tut es das nicht.
--- snip ---
template
participants (2)
-
Bastian Schern
-
Stefan Hundhammer