Problem mit << (Standard filestream Operator)
Mit Bitset und << in einen Outputfilestream wurde jedes 0 und jedes 1 zu einem Ascii gewandelt.
std::bitset<16> left (161); std::bitset<8> symbol(98); std::ofstream ofs; ofs.open("treebinary.bin", std::ofstream::binary) ofs << left << symbol ; ofs.close()
Dateigrösse (16 + 8) * 1 Char = 24 Byte. (Faktor 8 zu gross).
Lösung write( Pointer to Data, size)
In der Funktion write kann ein Pointer übergeben werden. Dadurch findet keine Umwandlung in String (durch <<) statt. Die 0 und 1er werden direkt binär geschrieben.
char data[3] // 3 Bytes // inhalt von 1 Byte und 2 Bytes std::bitset<16> left (361); std::bitset<8> symbol(98); // array füllen data[0] = left; data[2] = symbol; //array in 1mal ausgeben std::ofstream ofs; ofs.write((char *) data , 3) ofs.close()
- Alle Bits werden auf einmal geschrieben
- kein << left << symbol notwendig
- Man gibt den Pointer mit und die Länge der Daten
char* data[3] // initalisiert als Pointer std::bitset<16> left (361); std::bitset<8> symbol(98); data[0] = left; data[2] = symbol; std::ofstream ofs; ofs.write(data , sizeof() ofs.close()
// array of struct std::struct Node { uint16_t left = 0; uint16_t right = 0; uint8_t symbol = 0; bool filled = false; }; Node tree[100]; // füllen des arrays per tree-funktion // array per Pointer mitgeben, länge = Node-länge * Anzahl std::ofstream ofs; ofs.write((char*) tree , sizeof( (struct Node) * 100); ofs.close()