Reset (процедура)

Язык:
Русский
English

 Reset (процедура)


Открывает существующий файл.

Объявление

 Procedure Reset(Var F [ : File; Recsize : Word ] );

Режим

Windows, Real, Protected

Замечания

Параметр F - переменная любого файлового типа, связанная с внешним файлом, с использованием процедуры Assign. Параметр RecSize - необязательный параметр, который может быть определен только, если F - нетипизированный файл. В этом случае, RecSize определяет размер блока, который нужно использовать при передаче данных. Если RecSize опущен, принят заданный по умолчанию размер блока в 128 байт.

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

Если переменной F назначено пустое имя, например Assign(F, ''), то после обращения к Reset, переменная F будет относиться к стандартному входному файлу (стандартный номер дескриптора = 0).

Если F — текстовый файл, то он открывается только на чтение. После обращения к Reset, Eof(F) = True, если файл пуст, иначе Eof (F) = False.

В режиме {$I-} функция IOResult вернет 0, если операция была успешна, иначе, она возвращает отличный от нуля код ошибки.

FileMode

Если F не является текстовым (типизированный или нетипизированный), файл открывается на чтение и запись, либо только на чтение, в зависимости от значения переменной FileMode 2 или 0, соответственно.

  • С одной стороны, переменная FileMode слабо задокументирована. В TURBO.TPH можно найти FileMode через алфавитный указатель, но в документации к Reset эта переменная вообще не упоминается.
  • С другой стороны, в большинстве версий Pascal (не только Turbo, но ещё и Delphi и TMT Pascal) она по умолчанию равна 2 (чтение и запись).
  • С третьей стороны, программы, открывающие бинарный файл при помощи Reset, обычно только читают из файла.

Всё это в совокупности приводит к тому, что программисты используют Reset, чтобы открыть файл на чтение, у программистов всё работает, потому что есть доступ на запись. Проблема остаётся незамеченной и обнаруживается только тогда, когда файл у пользователя по какой–то причине доступен только для чтения. Например, потому что записан на CD-ROM или сетевой диск без доступа на запись. Если в режиме FileMode = 2 файл не удалось открыть на чтение и запись, файл не открывается совсем, и программа завершается аварийно или работает некорректно. Из–за недостаточной задокументированности FileMode проблема возникла даже у программистов фирмы Borland. InitGraph открывает BGI драйвер при помощи Reset и, если к BGI драйверу нет доступа на запись, графику инициализировать не удаётся. Будучи записаны на CD-ROM, ваши графические программы перестают работать. Проблема старая, но до сих пор актуальная. Например, она встречалась в Ёжиках в Quake II, написанных на Delphi.

По всем этим соображениям в School Pak по умолчанию значение этой переменной изменено на 0, но это может привести к обратным последствиям: в файлы, открытые Reset, не удаётся ничего записать.

Чтобы ни в одной из версий Pascal не возникало ни той, ни другой проблемы, всегда перед Reset и InitGraph устанавливайте значение FileMode на нужное.

См. также

Пример

Язык:
Русский
English


 { Пример программы для процедуры Reset }

function FileExists(FileName : String) : Boolean;

{ Функция возвращает True, если файл существует, иначе
  возвращает False. Закрывает файл, если он существует. }


var
  F : File;
begin
 {$I-}
  Assign(F, FileName);
 Reset(F);
 Close(F);
 {$I+}
 FileExists := (IOResult = 0) and (FileName <> '');
end;  { FileExists }

begin
 { Получаем имя файла из командной строки }
 if FileExists(ParamStr(1)) then
   WriteLn('Файл существует.')
 else
   WriteLn('Файл не найден!');
end.
Тэги: Reset
| G+
Код для вставки: :: :: :: ::
Поделиться: // //