Двоичный ввод вывод данных
Например есть булев, лонг и целое число... нужно это попорядку в файле записать... Но ничто не получаетя... или допустим как можно составить целое число из битов??
Вот пример кода
bool a = 1;
bool b = 0;
FILE * f = fopen("D:\\data","wb");
fwrite(&b,sizeof(a),1,f);
fwrite(&a,sizeof(a),1,f);
fwrite(&a,sizeof(a),1,f);
fwrite(&b,sizeof(a),1,f);
fwrite(&b,sizeof(a),1,f);
fwrite(&a,sizeof(a),1,f);
fwrite(&b,sizeof(a),1,f);
fwrite(&b,sizeof(a),1,f);
fclose(f);
По идее здесь должно записаться в файл 01100100b
Что в десятиричной системе 100, или символ d
Думал что и будет в итоге в файле data символ d, вместо этого получился файл размером в 8 байт и с квадратиками:(
По идее здесь должно записаться в файл 01100100b
Что в десятиричной системе 100, или символ d
По идее там должно записаться в файл 8 байт, что мы и наблюдаем :). Т.к. размер типа bool - 1 байт.
Знаком с объединениями и битовыми полями? Подскаываю:
{
unsigned char ch;
struct bits
{
bool bit0:1;
bool bit1:1;
bool bit2:1;
bool bit3:1;
bool bit4:1;
bool bit5:1;
bool bit6:1;
bool bit7:1;
}bits;
}my_union;
Пример: теперь, для доступа к третьему биту из my_union.ch можно применить следующий оператор:
my_union.bits.bit3=1;
Если у тебя в ch был ноль, то теперь будет 00010000b.
Установил все биты как надо - пиши в файл fputc(my_union.ch,file); - для записи отдельных байтов лучше использовать fputc, т.к. она меньше ест ресурсы системы, соответственно работает быстрее.
С остальными типами данных - аналогично: вписываешь их в объединение, учитывая их длинну.
А если я хачу записать в файл только один или два бита и не более....
Или бит, а потом целое число... Так что получится 9 бит... Или это нереально? Чтобы файл занимал место 9 бит? Наверное нет из за существование кластеров... Кхм... просто хачу экономию места, пишу нечто вроде базы данных для хранения, некоторых булевых строковых и целочисленных значений, наверное тогда придется тратить на простой будевский тип целый байт... Спасибо!
Хм, fputc
А если я хачу записать в файл только один или два бита и не более....
Или бит, а потом целое число... Так что получится 9 бит... Или это нереально? Чтобы файл занимал место 9 бит? Наверное нет из за существование кластеров...
Ты прав - сам ответил на свой вопрос. Минимум 2 кб для NTFS или 512 байт для FAT. Да и функций, которые пишут в файл побитово мне неизвестно.
Кхм... просто хачу экономию места, пишу нечто вроде базы данных для хранения, некоторых булевых строковых и целочисленных значений, наверное тогда придется тратить на простой будевский тип целый байт... Спасибо!
Ну так ты и воспользуйся битовыми полями. Экономия памяти - это одно из их прямых предназначений.
Например считывай (записывай) один байт в объединение подобное приведенному, а затем разбирай его побитово: каждый бит - одно булевское значение. В итоге в одном байте 8 булевских значений, что дает неплохую экономию памяти если в базе много полей типа "да/нет" или "м/ж". Правда при этом может пострадать быстродействие. В общем решай сам.
Нет уж, писать в файл по битам - это нонсенс. Минимальный физический квант - байт, отсюда и смотри. Если ты найдешь в системе или создашь файл размером 1 ну на крайняк 2 бита, сразу Нобелевку получишь за новое слово в методах хранения цифровой информации:D
плакал... что такое "минимальный физический квант"? :D если уж на то пошло, все таки бит - минимальная единица информации.
pacific_7
вы видимо перепутали. для NTFS минимум 512 байт :)
плакал... что такое "минимальный физический квант"? :D если уж на то пошло, все таки бит - минимальная единица информации.
pacific_7
вы видимо перепутали. для NTFS минимум 512 байт :)
Ну успокойтесь, не плачьте :) Квант в данном контексте - минимальная "доза" информации для записи в файл (прикладные программы). И давайте не путать кислое с мягким, размер кластера - немного не тот уровень. Прикладного программиста (если он по совместительству не системщик) мало интересует размер кластера NTFS. Или вы считаете, что в функции WriteFile(...) и иже с ней, я указываю размер буфера в кластерах? Как бы самому не расплакаться :D
Квант в данном контексте - минимальная "доза" информации для записи в файл (прикладные программы). И давайте не путать кислое с мягким,
квант - возможно. а вот физический квант - этот термин абсолютно здесь не причем. потому что при ФИЗИЧЕСКОМ обмене с ЖД "кванты" совсем другие.
вы считаете, что в функции WriteFile(...) и иже с ней, я указываю размер буфера в кластерах? Как бы самому не расплакаться :D
не считаю. но считаю, что прикладной программист обязан помнить, что записывая на диск один байт, он на самом деле записывает 512 байт (4кб, 16кб - нужное подчеркнуть)
квант - возможно. а вот физический квант - этот термин абсолютно здесь не причем. потому что при ФИЗИЧЕСКОМ обмене с ЖД "кванты" совсем другие.
Не придирайтесь к словам - читайте в контексте.
не считаю. но считаю, что прикладной программист обязан помнить, что записывая на диск один байт, он на самом деле записывает 512 байт (4кб, 16кб - нужное подчеркнуть)
BYTE bByte = 0xFF;
ULONG ulWritten;
hFile = CreateFile("c:/byte.bin", GENERIC_WRITE, NULL, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(hFile, &bByte, sizeof(bByte), &ulWritten, NULL);
CloseHandle(hFile);
Операционка может писать туда что угодно, размер файла бу 1 байт. Для этого и создавался API и HAL, чтобы прикладник(ГЛАВНОЕ СЛОВО) не парил себе мозг тонкостями реализации файловых систем.
А рассуждая вашими категориями можно и до firmware HDD-контроллеров дойти.
BYTE bByte = 0xFF;
ULONG ulWritten;
hFile = CreateFile("c:/byte.bin", GENERIC_WRITE, NULL, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(hFile, &ucByte, sizeof(bByte), &ulWritten, NULL);
CloseHandle(hFile);
Операционка может писать туда что угодно, размер файла бу 1 байт. Для этого и создавался API и HAL, чтобы прикладник(ГЛАВНОЕ СЛОВО) не парил себе мозг тонкостями реализации файловых систем.
А рассуждая вашими категориями можно и до firmware HDD-контроллеров дойти.
точку зрения вашу понял. спорить не буду. только я не делю программеров на прикладных и системных. специализироваться человек может и на написании прошивок для микроконтроллеров, на разработке САПР, написании графических движков... но знать свое орудие производства обязан от и до. ИМХО, ессно.
Ты прав - сам ответил на свой вопрос. Минимум 2 кб для NTFS или 512 байт для FAT. Да и функций, которые пишут в файл побитово мне неизвестно.
Для сведения: файлы ненулевого размера в FAT занимают один кластер, а в NTFS могут ни одного - т. к. короткие файлы пишутся непосредственно в MFT. Сколько точно не помню, смотри в доке.
Для сведения: файлы ненулевого размера в FAT занимают один кластер, а в NTFS могут ни одного - т. к. короткие файлы пишутся непосредственно в MFT. Сколько точно не помню, смотри в доке.
Благодарствую - известно. Размеры записей MFT 1, 2, 4 кб - в зависимости от размера диска. Записи размером менше 2-х k при современных объемах дисков уже не встретишь.
Теперь вопрос к вам: интересно, а где расположена MFT??? Наверняка не в ОЗУ.
вы видимо перепутали. для NTFS минимум 512 байт
Ну, я даже не знаю. Это проверка бдительности? :)
Для FAT: 512 байт это точно. Доказательство: размер файла в 6 байт на дискете - 512 байт. Убедил?
Теперь о NTFS: см. выше размер записей в таблице MFT и упоминание о ее размерах на современных дисках (источник: учебник "Сетевые операционные системы" Олиферов, за 2002 год).
Идем далее: куда запишется маленький файлик? В MFT! Сколько места он там займет? Ладно, при маленьком диске - 1 кб, но ни как не 512 байт.
Согласны с приведенным источником и моими измышлениями?
Согласны с приведенным источником и моими измышлениями?
Мы отвлеклись от темы. Вопрос был про бит мудрости.