Vorrei sapere come si può leggere/scrivere su un file singoli bit e gestirli con un'applicazione C.
E un quesito strano, ma sto provando la compressione di Huffman ...
Vorrei sapere come si può leggere/scrivere su un file singoli bit e gestirli con un'applicazione C.
E un quesito strano, ma sto provando la compressione di Huffman ...
printf("Programmazione in C!");
cout<<"Programmazione in C++!";
Non puoi.
Il minimo che si può scrivere su file è un byte. Quindi devi gestirti i bit impacchettandoli in un byte con i bit operator.
Leggere/scrivere singoli bit è impossibile, mentre è possibile leggere/scrivere singoli byte (tramite fgetc e fputc).
---EDIT---
Anticipato..
Amaro C++, il gusto pieno dell'undefined behavior.
Quindi non posso eseguire operazioni di input/output sul file di singoli bit...
Tuttavia posso scomporre i byte letti in bit o assemblare bit in byte per scriverli?
printf("Programmazione in C!");
cout<<"Programmazione in C++!";
Come?
printf("Programmazione in C!");
cout<<"Programmazione in C++!";
Dalle risposte precedenti :
"... è possibile leggere/scrivere singoli byte (tramite fgetc e fputc). ..."
"... Quindi devi gestirti i bit impacchettandoli in un byte con i bit operator ..."
Puoi utilizzare gli operatori a bit
&
|
^
Sicome non li ho mai usati mi faresti un esempio di come posso comporre un byte utilizzando otto bit con questi operatori?
Inoltre mi chiedo se i bit fossero più dei byte? (ad esempio 8byte + 3bit) come faccio a non perderli? (Logicamente l'algoritmo di Huffman è un metodo di compressione loseless)
printf("Programmazione in C!");
cout<<"Programmazione in C++!";
http://www.cs.cf.ac.uk/Dave/C/node13.html
Si può anche fare con un mix di strutture e union "particolari":
codice:struct byteBF { unsigned bit0:1; unsigned bit1:1; unsigned bit2:1; unsigned bit3:1; unsigned bit4:1; unsigned bit5:1; unsigned bit6:1; unsigned bit7:1; } union byte_u { struct byteBF bBF; unsigned char byte; } /*...*/ union byte_u bu; bu.byte=0; bu.bBF.bit0=1; bu.bBF.bit1=1; bu.bBF.bit2=0; /*...*/ fputc(bu.byte,stream);
Amaro C++, il gusto pieno dell'undefined behavior.
Non puoi utilizzare 8 byte e 3 bit ... devi utilizzare 9 byte ...codice:unsigned char b = 0; // Set bit 4 b |= (1 << 4); printf("%02X\n", b); // Set bit 7 b |= (1 << 7); printf("%02X\n", b); // Clear bit 4 b &= ~(1 << 4); printf("%02X\n", b); // Set bit 2 b |= (1 << 2); printf("%02X\n", b); // Clear bit 7 b &= ~(1 << 7); printf("%02X\n", b);