ЧАСТЬ 3

ИНФОРМАТИКА

Электронное учебно-методическое пособие

 

 
 

 

5.4. Файлы в среде Borland B++ Builder

Двоичные файлы, уже существующие на диске, в ВСВ принято открывать с помощью функции _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(*имя_файла, доступ[,константа]);

Первый аргумент определяет имя открываемого файла. Второй параметр определяет способ доступа к данным и задаётся как непротиворечивая логическая комбинация из следующих констант:

  • O_RDONLY – файл открывается только для чтения;

  • O_WRONLY – файл открывается только для записи;

  • O_RDWR – файл открывается для записи и чтения;

  • O_APPEND – открывается существующий файл для пополнения имеющегося в нём набора данных (при открытии такого файла его указатель устанавливается вслед за последней существующей записью);

  • O_CREAT – используется для создания нового или открытия существующего файла;

  • O_TRUNC – позволяет удалить данные в существующем файле;

  • O_BINARY – открываемый файл будет работать в двоичном режиме;

  • О_ТЕХТ – открываемый файл будет работать в текстовом режиме.

Необязательный третий аргумент может принимать одно из трёх следующих значений – 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:

  • относительно текущей позиции указателя, если третий аргумент равен SEEK_CUR. В этом случае смещение может быть как положительным, так и отрицательным;

  • относительно начала файла, если третий аргумент равен SEEK_SET. В этом случае смещение должно быть положительным;

  • относительно конца файла, если третий аргумент равен SEEK_END. В этом случае смещение должно быть отрицательным.

Система ВСВ предлагает довольно большой набор функций по управлению файлами и каталогами, реализуемых в конечном итоге через процедуры Windows. Их перечень приведён в табл. 5.1 и в окончании табл. 5.1 без указания формата их вызова.

Как правило, имена файлов и каталогов среди параметров этих процедур имеют тип Ansistring. Более полную информацию можно получить в файле помощи.

 

 


© Сибирская государственная геодезическая академия (СГГА), 2011