Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ida.final.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
6 Mб
Скачать

Void fclose (long handle);

Функция закрывает файлы, открытые с помощью fopen. В момент закрытия файла в него записываются все данные, находящиеся в этот момент во внутренних буферах, а файловый объект (то есть то, на что ссылается дескриптор) уничтожается, предотвращая утечку ресурсов.

Файлы автоматически закрываются в момент завершения работы породившего их скрипта (при условии, что обладающая дескриптором процедура не описана как static), а так же при корректном завершении работы IDA.

В противном же случае операционная система все равно освободит все ресурсы, принадлежащие процессу, но при этом не будут записаны данные, оставшиеся во внутренних буферах.

Функция не возвращает результата успешности операции.

Операнд

Пояснения

handle

Дескриптор открытого файла

Пример использования:

Auto a;

A=fopen(“PRN”,”wt”);

If (a!=-1)

writestr(a,”Hello,Printer!”);

fclose(a);

Обратите внимание, что в приведенном примере fclose выполняется даже тогда, когда файл не был успешно открыт. Это не ошибка, поскольку fclose(0) не приводит ни к каким побочным последствиям.

Long filelength (long handle);

Функция возвращает логическую длину открытого файла. То есть длину с учетом не записанных внутренних буферов, которая может не совпадать с физическим размером файла на диске в данный момент.

Длина символьных устройств (таких, как PRN, например) всегда равна нулю. Например:

Message(“0x%X \n”,filelngth(fopen(“PRN”, “wt”));

0x0

Операнд

Пояснения

handle

Дескриптор открытого файла

Long fseek (long handle,long offset,long origin);

Функция позиционирует указатель в открытом файле. Флаг origin, задающий необходимое позиционирование может принимать следующие значения, перечисленные ниже в таблице:

origin

Значение

0

Позиционировать относительно начала файла

1

Позиционировать относительно текущей позиции

2

Позиционировать относительно конца файла

Правда вплоть до версии 4.0 эта функция реализована с ошибкой, приводящей к тому, что флаг ‘1’ трактуется точно так, как и ‘0’ – то есть относительно начла файла.

Это видно на следующем примере:

auto a;

a=Fopen(“myfile”,”wt”);

fseek(a,0x10,0);

Message(“0x%X \n”,ftell(a));

fseek(a,0x0,1);

Message(“0x%X \n”,ftell(a));

fclose(a);

0x10

0x0

Так же не поддерживается отрицательная адресация относительно начала файла. Относительно конца файла можно свободно позиционироваться в двух направлениях.

auto a;

a=Fopen(“myfile”,”wt”);

fseek(a,0x0,2);

Message(“0x%X \n”,ftell(a));

fseek(a,0x5,2);

Message(“0x%X \n”,ftell(a));

fseek(a,-0x5,2);

Message(“0x%X \n”,ftell(a));

fclose(a);

0x100

0x105

0x100

Напомним, что ранние версии DOS содержали ошибку, приводящую к тому, что наращивании размера файла с помощью функции позиционирования сверх определенного размера (зависящего от многих обстоятельств) нарушалась целостность FAT16.

Та же ошибка повторена в первых реализациях FAT32 (Windows 95 OSP0, в народе прозванная «Лебединая редакция»)

При перемещении указателя за конец файла в него подает, информация, расположенная в выделяемых ему дисковой подсистемой кластерах. При этом файл не должен быть открыт на запись, иначе игнорируя флаг, функция будет вычислять смещение относительно файла и его содержание окажется утерянным!

Так же оно окажется утерянным, если указать неверное отрицательное смещение или origin > 2.

Операнд

Пояснение

Handle

Обработчик открытого файла

Offset

Смещение (относительно конца файла - знаковое)

Origin

Указывает, относительно чего отсчитывается смещение (смотри таблицу выше)

Return

Завершение

Возвращаемое значение

Успешно

0

Ошибка

!=0

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]