Побитовая запись [си]
А вас не смущает тот факт, что минимальная адресуемая ячейка памяти в компьютере имеет размер в 8 бит (1 байт)? С файлами как бы также. Меньше 8 бит записать в файл не получится, более того, минимальный объем данных, записываемый в файл варьируется в зависимости от файловой системы. Файл, содержащий 1 байт данных будет занимать на диске несколько больше места (4КБ например).
Ну, ради юмора, можно наваять свою виртуальную файловую систему...
Коды пакуются и в одном байте может оказаться несколько символов.
попустим есть структура
unsigned 1bit : 1;
unsigned 2bit : 1;
unsigned 3bit : 1;
unsigned 4bit : 1;
unsigned 5bit : 1;
unsigned 6bit : 1;
unsigned 7bit : 1;
unsigned 8bit : 1;
} byte;
каким образом эту структуру загнать в файл ?
Тут наверно преобразование типов пройдет или лучше воспользоваться union (как - в поиск). Но я делаю по другому. Например, есть символ
unsigned char ch = 0xFF; // или 0x00 или еще какой - не важно
тогда для обнуления в нем первого бита используем ch & (~0x01), а для установки первого бита ch | 0x01.
Если нужно поменять не первый бит, то сдвигаем единичку влево с помощью оператора <<
каким образом эту структуру загнать в файл ?
#pragma pack(push, 1) //выравнивание
struct Byte
{
unsigned bit1 : 1;
};
#pragma pack(pop)
int main(int argc, char **argv)
{
Byte byte;
FILE *filehandle = NULL;
byte.bit1 = true;
filehandle = fopen("file.bin", "wb"); //режим wb
if(!filehandle)
return 0;
if(!fwrite(&byte, sizeof(byte), 1, filehandle))
return 0;
if(filehandle)
fclose(filehandle);
return 1;
}
каким образом эту структуру загнать в файл ?
взять все биты, объединить в байты, дополнить до целого и записать.