Мы обычно говорим, что число 5
может быть представлено как 3
битное двоичное число. Но, если мы преобразуем 5
в его двоичное представление, то есть 101
и напечатаем его в текстовый файл, он фактически занимает 3
байта, поскольку он читается как массив символов. Как я могу создать файл (не обязательно текстовый файл), чтобы размер этого файла составлял 3
бита?
Вы можете логически представить 5 как три бита, но ни файловая система, ни система управления памятью (для ОЗУ) не позволят вам адресовать пространство в единицах меньше одного байта.
Если бы у вас было восемь из этих чисел, вы могли бы упаковать их в 24 бит = 3 байта и сохранить их "эффективно" в памяти или файле. Эффективно в кавычках, потому что, сохраняя какое-то пространство, становится сложно работать с упакованными данными, так как вам нужно много смещать вещи. Инструкции CPU, загрузки памяти, индексирование массива и т.д. Не работают с менее чем байтовыми единицами.
Самый практичный способ - просто использовать целый байт для трех бит и жить с накладными расходами.
Я не думаю, что вы получите файловую систему, которая сообщит вам, что файл имеет 3 бита. Он будет по крайней мере байт, плюс память для дополнительной информации о файле.
Но вы можете просто открыть файл для записи и написать 3
как двоичный файл.
FILE *ptr;
ptr = fopen("file", "wb");
fwrite('a', 1, 1, ptr);
Вы можете использовать следующий код и работать на основе этого... следующий код хранит три числа (5, 3 и 2) в одном байте. для хранения 3 чисел файл занимает только один байт. в общем случае мы не можем хранить данные в частичных байтах в файлах.
#include<stdio.h>
struct bits
{
unsigned char first:3,second:3,third:2;
};
main()
{
struct bits b;
FILE *f;
b.first=5;
b.second=3;
b.third=2;
printf("\ninitial data:%u %u %u",b.first,b.second,b.third);
/*storing in file*/
f=fopen("bitsfile","w");
fwrite(&b,sizeof(b),1,f);
fclose(f);
/*reading back from file*/
f=fopen("bitsfile","r");
fread(&b,sizeof(b),1,f);
fclose(f);
printf("\ndata read from file:%u %u %u",b.first,b.second,b.third);
}
Обычно вы не можете, поскольку бинарные файлы имеют минимальный "квант", который является байтом (8 бит). Есть что-то интересное в сохранении символов с не однородной длиной бита с использованием кодирования Хаффмана. Просто объясните, прежде чем читать полную статью: ваши символы алфавита остаются на каждом бинарном листе дерева. Существует один путь 1 (т.е. слева) 0 (т.е. справа), начиная с корня и приземляющегося на ваш символ. Если дерево не сбалансировано (и это будет), разные символы могут быть представлены однозначно с разной длиной бита. конечно, есть некоторые усилия, потому что вы должны всегда читать файл на уровне байтов, а затем распаковывать и обрабатывать биты с реализацией вашего алгоритма.