If константное выражение группа операций #elif константное выражение группа операций #else группа операций #endif
Отличие директив #ifdef/#ifndef заключается в том, что константное выражение может быть задано только с помощью #define.
У каждой директивы #if в исходном файле должна быть соответствующая закрывающая директива #endif. Между директивами #if и #endif может располагаться любое количество директив #elif, однако допускается не более одной директивы #else. Директива #else, если присутствует, должна быть последней перед директивой #endif.
Пример
#include <stdio.h>
#include <stdlib.h>
#define P 2
int main()
{
getchar system("chcp 1251");
system("cls");
#if P==1
printf("Выполняется ветка 1");
#elif P==2
printf("Выполняется ветка 2, P=%d", P);
#else
printf("Выполняется другая ветка, P=%d", P);
#endif ();
return 0;
}
Результат выполнения
Реализация функции задержки
#include <stdio.h>
#include <time.h>
void delay(int ms) // аргумент- требуемое время задержки в миллисекундах
{
int c = clock() + ms;
while(clock() < c);
}
int main()
{
printf("clock = %d\n", clock());
delay(1000);
printf("clock = %d\n", clock());
getchar();
return 0;
}
Результат выполнения
Назад
Работа с файлами
Для удобства обращения информация в запоминающих устройствах хранится в виде файлов.
Файл – именованная область внешней памяти, выделенная для хранения массива данных. Данные, содержащиеся в файлах, имеют самый разнообразный характер: программы на алгоритмическом или машинном языке; исходные данные для работы программ или результаты выполнения программ; произвольные тексты; графические изображения и т. п.
Каталог (папка, директория) – именованная совокупность байтов на носителе информации, содержащая название подкаталогов и файлов, используется в файловой системе для упрощения организации файлов.
Файловой системой называется функциональная часть операционной системы, обеспечивающая выполнение операций над файлами. Примерами файловых систем являются FAT (FAT – File Allocation Table, таблица размещения файлов), NTFS, UDF (используется на компакт-дисках).
Существуют три основные версии FAT: FAT12, FAT16 и FAT32. Они отличаются разрядностью записей в дисковой структуре, т.е. количеством бит, отведённых для хранения номера кластера. FAT12 применяется в основном для дискет (до 4 кбайт), FAT16 – для дисков малого объёма, FAT32 – для FLASH-накопителей большой емкости (до 32 Гбайт).
Рассмотрим структуру файловой системы на примере FAT32.
Файловая структура FAT32
Устройства внешней памяти в системе FAT32 имеют не байтовую, а блочную адресацию. Запись информации в устройство внешней памяти осуществляется блоками или секторами.
Сектор – минимальная адресуемая единица хранения информации на внешних запоминающих устройствах. Как правило, размер сектора фиксирован и составляет 512 байт. Для увеличения адресного пространства устройств внешней памяти сектора объединяют в группы, называемые кластерами.
Кластер – объединение нескольких секторов, которое может рассматриваться как самостоятельная единица, обладающая определёнными свойствами. Основным свойством кластера является его размер, измеряемый в количестве секторов или количестве байт.
Файловая система FAT32 имеет следующую структуру.
Нумерация кластеров, используемых для записи файлов, ведется с 2. Как правило, кластер №2 используется корневым каталогом, а начиная с кластера №3 хранится массив данных. Сектора, используемые для хранения информации, представленной выше корневого каталога, в кластеры не объединяются.
Минимальный размер файла, занимаемый на диске, соответствует 1 кластеру.
Загрузочный сектор начинается следующей информацией:
· EB 58 90 – безусловный переход и сигнатура;
· 4D 53 44 4F 53 35 2E 30 MSDOS5.0;
· 00 02 – количество байт в секторе (обычно 512);
· 1 байт – количество секторов в кластере;
· 2 байта – количество резервных секторов.
Кроме того, загрузочный сектор содержит следующую важную информацию:
· 0x10 (1 байт) – количество таблиц FAT (обычно 2);
· 0x20 (4 байта) – количество секторов на диске;
· 0x2С (4 байта) – номер кластера корневого каталога;
· 0x47 (11 байт) – метка тома;
· 0x1FE (2 байта) – сигнатура загрузочного сектора (55 AA).
Сектор информации файловой системы содержит:
· 0x00 (4 байта) – сигнатура (52 52 61 41);
· 0x1E4 (4 байта) – сигнатура (72 72 41 61);
· 0x1E8 (4 байта) – количество свободных кластеров, -1 если не известно;
· 0x1EС (4 байта) – номер последнего записанного кластера;
· 0x1FE (2 байта) – сигнатура (55 AA).
Таблица FAT содержит информацию о состоянии каждого кластера на диске. Младшие 2 байт таблицы FAT хранят F8 FF FF 0F FF FF FF FF (что соответствует состоянию кластеров 0 и 1, физически отсутствующих). Далее состояние каждого кластера содержит номер кластера, в котором продолжается текущий файл или следующую информацию:
· 00 00 00 00 – кластер свободен;
· FF FF FF 0F – конец текущего файла.
Корневой каталог содержит набор 32-битных записей информации о каждом файле, содержащих следующую информацию:
· 8 байт – имя файла;
· 3 байта – расширение файла;
Корневой каталог содержит набор 32-битных записей информации о каждом файле, содержащих следующую информацию:
· 8 байт – имя файла;
· 3 байта – расширение файла;
· 1 байт – атрибут файла:
· 1 байт – зарезервирован;
· 1 байт – время создания (миллисекунды) (число от 0 до 199);
· 2 байта – время создания (с точностью до 2с):
· 2 байта – дата создания:
· 2 байта – дата последнего доступа;
· 2 байта – старшие 2 байта начального кластера;
· 2 байта – время последней модификации;
· 2 байта – дата последней модификации;
· 2 байта – младшие 2 байта начального кластера;
· 4 байта – размер файла (в байтах).
В случае работы с длинными именами файлов (включая русские имена) кодировка имени файла производится в системе кодировки UTF-16. При этого для кодирования каждого символа отводится 2 байта. При этом имя файла записывается в виде следующей структуры:
· 1 байт последовательности;
· 10 байт содержат младшие 5 символов имени файла;
· 1 байт атрибут;
· 1 байт резервный;
· 1 байт – контрольная сумма имени DOS;
· 12 байт содержат младшие 3 символа имени файла;
· 2 байта – номер первого кластера;
· остальные символы длинного имени.
Далее следует запись, включающая имя файла в формате 8.3 в обычном формате.