Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Двоичный ввод вывод данных

299
30 мая 2005 года
3D Bob
885 / / 18.04.2005
Помогите разобраться с двоичным вводом выводом данных... Что-то все никак ничто не хочет получаться(((
Например есть булев, лонг и целое число... нужно это попорядку в файле записать... Но ничто не получаетя... или допустим как можно составить целое число из битов??

Вот пример кода

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 байт и с квадратиками:(
243
30 мая 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by 3D Bob

По идее здесь должно записаться в файл 01100100b
Что в десятиричной системе 100, или символ d


По идее там должно записаться в файл 8 байт, что мы и наблюдаем :). Т.к. размер типа bool - 1 байт.
Знаком с объединениями и битовыми полями? Подскаываю:

Код:
union X
{
     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, т.к. она меньше ест ресурсы системы, соответственно работает быстрее.
С остальными типами данных - аналогично: вписываешь их в объединение, учитывая их длинну.
299
30 мая 2005 года
3D Bob
885 / / 18.04.2005
Хм, fputc

А если я хачу записать в файл только один или два бита и не более....
Или бит, а потом целое число... Так что получится 9 бит... Или это нереально? Чтобы файл занимал место 9 бит? Наверное нет из за существование кластеров... Кхм... просто хачу экономию места, пишу нечто вроде базы данных для хранения, некоторых булевых строковых и целочисленных значений, наверное тогда придется тратить на простой будевский тип целый байт... Спасибо!
243
30 мая 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by 3D Bob
Хм, fputc
А если я хачу записать в файл только один или два бита и не более....
Или бит, а потом целое число... Так что получится 9 бит... Или это нереально? Чтобы файл занимал место 9 бит? Наверное нет из за существование кластеров...


Ты прав - сам ответил на свой вопрос. Минимум 2 кб для NTFS или 512 байт для FAT. Да и функций, которые пишут в файл побитово мне неизвестно.

Цитата:
Originally posted by 3D Bob

Кхм... просто хачу экономию места, пишу нечто вроде базы данных для хранения, некоторых булевых строковых и целочисленных значений, наверное тогда придется тратить на простой будевский тип целый байт... Спасибо!


Ну так ты и воспользуйся битовыми полями. Экономия памяти - это одно из их прямых предназначений.

Например считывай (записывай) один байт в объединение подобное приведенному, а затем разбирай его побитово: каждый бит - одно булевское значение. В итоге в одном байте 8 булевских значений, что дает неплохую экономию памяти если в базе много полей типа "да/нет" или "м/ж". Правда при этом может пострадать быстродействие. В общем решай сам.

585
01 июня 2005 года
honeybeer
297 / / 06.09.2004
Нет уж, писать в файл по битам - это нонсенс. Минимальный физический квант - байт, отсюда и смотри. Если ты найдешь в системе или создашь файл размером 1 ну на крайняк 2 бита, сразу Нобелевку получишь за новое слово в методах хранения цифровой информации:D
2
01 июня 2005 года
squirL
5.6K / / 13.08.2003
Цитата:
Originally posted by honeybeer
Нет уж, писать в файл по битам - это нонсенс. Минимальный физический квант - байт, отсюда и смотри. Если ты найдешь в системе или создашь файл размером 1 ну на крайняк 2 бита, сразу Нобелевку получишь за новое слово в методах хранения цифровой информации:D


плакал... что такое "минимальный физический квант"? :D если уж на то пошло, все таки бит - минимальная единица информации.

pacific_7

Цитата:
Минимум 2 кб для NTFS или 512 байт для FAT


вы видимо перепутали. для NTFS минимум 512 байт :)

585
01 июня 2005 года
honeybeer
297 / / 06.09.2004
Цитата:
Originally posted by squirL
плакал... что такое "минимальный физический квант"? :D если уж на то пошло, все таки бит - минимальная единица информации.

pacific_7

вы видимо перепутали. для NTFS минимум 512 байт :)


Ну успокойтесь, не плачьте :) Квант в данном контексте - минимальная "доза" информации для записи в файл (прикладные программы). И давайте не путать кислое с мягким, размер кластера - немного не тот уровень. Прикладного программиста (если он по совместительству не системщик) мало интересует размер кластера NTFS. Или вы считаете, что в функции WriteFile(...) и иже с ней, я указываю размер буфера в кластерах? Как бы самому не расплакаться :D

2
01 июня 2005 года
squirL
5.6K / / 13.08.2003
Цитата:
Originally posted by honeybeer
Квант в данном контексте - минимальная "доза" информации для записи в файл (прикладные программы). И давайте не путать кислое с мягким,


квант - возможно. а вот физический квант - этот термин абсолютно здесь не причем. потому что при ФИЗИЧЕСКОМ обмене с ЖД "кванты" совсем другие.

Цитата:
Originally posted by honeybeer

вы считаете, что в функции WriteFile(...) и иже с ней, я указываю размер буфера в кластерах? Как бы самому не расплакаться :D


не считаю. но считаю, что прикладной программист обязан помнить, что записывая на диск один байт, он на самом деле записывает 512 байт (4кб, 16кб - нужное подчеркнуть)

585
01 июня 2005 года
honeybeer
297 / / 06.09.2004
Цитата:
Originally posted by squirL
квант - возможно. а вот физический квант - этот термин абсолютно здесь не причем. потому что при ФИЗИЧЕСКОМ обмене с ЖД "кванты" совсем другие.


Не придирайтесь к словам - читайте в контексте.

Цитата:
Originally posted by squirL
не считаю. но считаю, что прикладной программист обязан помнить, что записывая на диск один байт, он на самом деле записывает 512 байт (4кб, 16кб - нужное подчеркнуть)


 
Код:
HANDLE hFile;
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-контроллеров дойти.
2
01 июня 2005 года
squirL
5.6K / / 13.08.2003
Цитата:
Originally posted by honeybeer

 
Код:
HANDLE hFile;
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-контроллеров дойти.


точку зрения вашу понял. спорить не буду. только я не делю программеров на прикладных и системных. специализироваться человек может и на написании прошивок для микроконтроллеров, на разработке САПР, написании графических движков... но знать свое орудие производства обязан от и до. ИМХО, ессно.

10
01 июня 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by pacific_7
Ты прав - сам ответил на свой вопрос. Минимум 2 кб для NTFS или 512 байт для FAT. Да и функций, которые пишут в файл побитово мне неизвестно.


Для сведения: файлы ненулевого размера в FAT занимают один кластер, а в NTFS могут ни одного - т. к. короткие файлы пишутся непосредственно в MFT. Сколько точно не помню, смотри в доке.

243
02 июня 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Freeman
Для сведения: файлы ненулевого размера в FAT занимают один кластер, а в NTFS могут ни одного - т. к. короткие файлы пишутся непосредственно в MFT. Сколько точно не помню, смотри в доке.


Благодарствую - известно. Размеры записей MFT 1, 2, 4 кб - в зависимости от размера диска. Записи размером менше 2-х k при современных объемах дисков уже не встретишь.
Теперь вопрос к вам: интересно, а где расположена MFT??? Наверняка не в ОЗУ.

Цитата:
Originally posted by squirL

вы видимо перепутали. для NTFS минимум 512 байт


Ну, я даже не знаю. Это проверка бдительности? :)
Для FAT: 512 байт это точно. Доказательство: размер файла в 6 байт на дискете - 512 байт. Убедил?
Теперь о NTFS: см. выше размер записей в таблице MFT и упоминание о ее размерах на современных дисках (источник: учебник "Сетевые операционные системы" Олиферов, за 2002 год).
Идем далее: куда запишется маленький файлик? В MFT! Сколько места он там займет? Ладно, при маленьком диске - 1 кб, но ни как не 512 байт.
Согласны с приведенным источником и моими измышлениями?

10
02 июня 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by pacific_7
Согласны с приведенным источником и моими измышлениями?


Мы отвлеклись от темы. Вопрос был про бит мудрости.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог