W
Problem behoben, habe zuerst die einzelnen Bytes in einem stringstream-Objekt gespeichert und dann ausgelesen.
Ich will einen Strom von einzelnen Bits in eine Datei schreiben. Wenn ich es byteweise mache, klappt es. Ich hab schon eine Lösung programmiert nur klappt das nicht so ganz. Es sind seltsamerweise mehr Bits drin, als eigentlich sollten. Die Füllbits am Dateiende stören nicht, es tauchen aber zusätzlich vorher mehrere Nullen auf. Die Bits werden beim nächsten Programmaufruf ausgewertet, das Programm stürzt dann unweigerlich ab. Es gibt zwei unterschiedliche Datentypen, die gespeichert werden unsigned char oder boolean.
In der Datei steht dann folgende wenn ich jedes einzelne Bit auswerte:
01z01k01h01g1i(korrekt, wenn ich byteweise speichere)
01z01k01h01g000000001i0000000(nicht korrekt, hinter dem g dürften keine Nullen sein. Die Füllbits am Ende sind in Ordnung um ein einzelnes Byte vollzukriegen.)
template <typename T>inline bool bit(T& zahl,int position)//einzelnes Bit
{
return (zahl>>position) & 1;
}
template <typename T>inline int bits(T& zahl,int position, int anzahl)//mehrere Bits
{
return (zahl>>position) & ~(~0 << anzahl);
}
void puffer(void* objekt, bool typ=false);
fstream komp;
void codierung(node *zeiger,unsigned short value,int laenge)
{
bool tf;
if (zeiger->belegt)
{
tf=true;
puffer(&tf);
puffer(&(zeiger->z),1);
}
else
{
tf=false;
puffer(&tf);
codierung(zeiger->n[0],value*2,laenge+1);
codierung(zeiger->n[1],value*2+1,laenge+1);
}
}
unsigned char counter,b;
void puffer(void* objekt, bool typ)
{
if (!typ)
{
b=b<<1;
b+=*((bool*)objekt);
}
else
{
b=b<<(8-counter);
b+=bits<uchar> (*((char*)objekt),counter,8-counter);
komp.write((char *)&b,1);
b=0;
b+=bits<uchar> (*((char*)objekt),0,counter);
counter--;
}
if (counter%8==7)
{
komp.write((char *)&b,1);
counter=-1;
}
counter++;
}
//Hauptprogramm
...
komp.open(Dateiname,fstream::out | fstream::binary | fstream::trunc);
counter=0;
b=0;
codierung(head,0,0);
if (counter)//falls Bits noch im Puffer sind
{
b=b<<(8-counter);
komp.write((char *)&b,1);
}
komp.close();
....