Двоичные
файлы, уже существующие на диске, в ВСВ принято открывать с помощью
функции _rtl_open:
nf = _rtl_open(*имя_файла, флаг);
где
первый параметр является указателем типа char * на строку с именем
открываемого файла или явно содержит эту строку. При явном задании
имени файла с полным путём необходимо вместо символа '\' набирать
два символа '\\'. В качестве второго аргумента используют одну из
мнемонических констант O_RDONLY, O_WRONLY или O__RDWR, определяющих
режим использования файла (для чтения, для записи, для чтения и записи)
[16].
Функция
_rtl_open возвращает целое число nf, заменяющее имя файла в последующих
операциях обмена. Иногда его называют дескриптором файла или номер
файла. Ошибка при открывании файла может быть вызвана указанием несуществующего
пути, попыткой открыть файл, используемый в данное время другой программой,
или неверным заданием режима. В этом случае возвращаемое значение
равно -1.
Для
создания нового двоичного файла или использования существующего с
уничтожением содержащихся в нём данных используется функция _rtl_creat:
nf = _rtl_creat (*имя_файла, атрибуты);
где
второй аргумент определяет такие атрибуты файла: только для чтения
(константа _A_RDONLY), скрытый (константа _A_HIDDEN), системный (константа
_A_SYSTEM), нормальный (константа _A_NORMAL), подлежащий архивации
(константа _A_ARCH).
При необходимости
присвоить файлу несколько атрибутов одновременно следует написать
логическую сумму таких констант, например – _A_RDONLY OR _A_HIDDEN.
Указанные мнемонические константы находятся в том же заголовочном
файле io.h, где находятся и прототипы функций _rtl_open, _rtl_creat,
_rtl_close, _rtl_write и _rtl_read. Создаваемый таким образом файл
доступен и для записи, и для чтения.
Запись
в двоичный файл осуществляется с помощью функции _rtl_write, которая
заменила устаревшую функцию _write:
int _rtl_write(int номер, void *буфер, unsigned длина);
Первым
её аргументом является номер файла. Информация, которая должна быть
записана на диск, готовится в массиве оперативной памяти, на который
«смотрит» указатель buf, а длина этого массива в байтах задаётся третьим
параметром len. Значение, возвращаемое функцией, определяет количество
успешно записанных байтов. Как правило, оно должно совпадать с заказанной
длиной len. Меньшее значение свидетельствует об ошибке, скорее всего
— о переполнении диска.
Функция
извлечения данных из двоичного файла имеет очень похожий формат и
аргументы у неё те же самые:
int _rtl_read(int nf, void *buf, unsigned len);
Если
возвращаемое значение меньше, чем запрашиваемое количество байт (len),
то программа прочитала последнюю порцию данных. И после этого функция
возвратит только нулевое значение.
Наряду
с новыми функциями, описанными выше, в заголовочном файле io.h находятся
заголовки ранее эксплуатировавшихся функций – open, creat, creatnew,
creattmp, с помощью которых можно открыть или создать файлы в текстовом
или двоичном режиме:
nf = open(*имя_файла, доступ[,константа]);
Первый
аргумент определяет имя открываемого файла. Второй параметр определяет
способ доступа к данным и задаётся как непротиворечивая логическая
комбинация из следующих констант:
Необязательный
третий аргумент может принимать одно из трёх следующих значений –
S_IREAD, S_IWRITE или S_IREAD | S_IWRITE. Он определяет направление
обмена. Вообще говоря, текстовый или двоичный файл может быть открыт
и без указания режима во втором параметре.
Дело
в том, что в файле io.h объявлена глобальная переменная _fmode, значением
которой по умолчанию является константа О_ТЕХТ. Она и оказывает влияние
на тип открываемого файла, если признак O_TEXT или O_BINARY опущен
при открытии или создании файла.
Функция
creat создает новый или открывает существующий файл. В отличие от
этого, функция creatnew сообщает об ошибке при попытке создать уже
существующий файл. Функция creattmp позволяет создать временный файл
в указанном каталоге. Для временного файла система сама формирует
уникальное имя и удаляет файл после его закрытия.
Все три
функции создают текстовый или двоичный файл в зависимости от значения
глобальной переменной _fmode. Функции open и creat возвращают целочисленный
номер открытого файла или выдают значение -1, если попытка открыть
файл не удалась.
Форматы
вызова функций write и read полностью совпадают с обращениями к функциям
_rtl_write и _rtl_read.
Для
перемещения указателя двоичного файла с номером nf в нужную позицию
предназначена функция lseek:
k = long Iseek (номер байта, смещение, fromwhere);
Позиция
(номер байта), в которую следует переместить указатель файла, определяется
как заданное целочисленное смещение относительно одной из трёх точек
fromwhere: