Язык:
Русский
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 на нужное.
См. также
Лекция №6.2: Ввод и вывод информации: текстовые файлы
Лекция №7.4: Записи. Бинарные файлы
Append
Assign
Close
ReWrite
Truncate
FileMode
Пример
Язык:
Русский
English
{ Пример программы для процедуры Reset }
{ Функция возвращает 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.