Содержание     Доступ к файлам Имена файлов Логические устройства Инициализация файлов Процедуры и функции для работы с файлами  
 

 

Файлы

 

1. Основные определения

Файл - именованная область внешней памяти ПЭВМ (жесткого диска, гибкой дискеты, электронного "виртуального" диска), либо логическое устройство - потенциальный источник или приемник информации.

Любой файл имеет три характерных особенности:

  • Во-первых, у него есть имя, что дает возможность программе работать одновременно с несколькими файлами.

  • Во-вторых, он содержит компоненты одного типа. Типом компонентов может быть любой тип Турбо-Паскаля, кроме файлов. Иными словами, нельзя создать «файл файлов».

  • В-третьих, длина вновь создаваемого файла никак не оговаривается при его объявлении и ограничивается только емкостью устройств внешней памяти.

Файловый тип или переменную файлового типа можно задать одним из трех способов:
< имя > = FILE OF <тип>;
< имя > = ТЕХТ;
< имя > = FILE; .

Здесь < имя > - имя файлового типа или файловой переменной,
FILE, OF, TЕХТ - кодовые слова (англ.: файл, из, текст),
< тип > - любой тип Турбо-Паскаля, кроме файлов. Пример:

Type
  Man=record
      Name: string;
      LastName: string;
   End;
  Men=file of Man;
Var
  Staff: Men;
  Numbers: file of real;
  Book: Text;
  A_File: File;

В зависимости от способа объявления можно выделить три вида файлов:

• типизированные (задаются предложением FILE OF ...),
• текстовые (задаются предложением ТЕХТ),
• нетипизированные (задаются предложением FILE).

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

2. Доступ к файлам

Любой Турбо-Паскалевой программе доступны два предварительно объявленных файла со стандартными файловыми переменными: INPUT - для чтения данных с клавиатуры и OUTPUT - для вывода на экран. Стандартный Паскаль требует обязательного упоминания этих файлов в заголовке программы. В Турбо-Паскале это необязательно, вот почему заголовок программы можно опускать.

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

Связывание файловой переменной с именем файла осуществляется обращением к встроенной процедуре ASSIGN:
ASSIGN(< ф.п. >, < имя файла или л.у. >);
Здесь < ф.п. > - файловая переменная (правильный идентификатор, объявленный в программе как переменная файлового типа);
< имя файла или л.у. > - текстовое выражение, содержащее имя файла или логическое устройство.

Пример:
Assign(Book,’PascalLecture.txt’);

Если имя файла задается в виде пустой строки, например, ASSIGN(f, ‘’), то файловая переменная связывается со стандартным файлом INPUT или ОUТРUТ.

3. Имена файлов

Имя файла - это любое выражение строкового типа, которое строится по правилам определения имен в дисковой операционной ДОС) ПЭВМ:

  • имя содержит до восьми разрещенных символов (разрешенные символы - это произвольные символы с кодами от 33 до 255, кроме символов пробел, точка, запятая, двоеточие, звездочка, знак вопроса, обратная косая черта, а также символ Забой - код 127 по стандарту АSCII);

  • имя начинается с любого разрешенного символа;

  • за именем может следовать расширение - последовательность до трех разрешенных символов; расширение, если оно есть, отделяется от имени точкой.

Перед именем может ставиться так называемый путь к файлу - имя диска и/или имя текущего каталога и имена каталогов вышестоящих уровней. Имя диска содержит одну из латинских букв A..Z, после которой ставится двоеточие. Имена А: и В: относятся к дисковым накопителям на гибких дискетах, имена С:, D: и т.д.-к жестким дискам. Эти имена могут относиться также к одному или нескольким виртуальным дискам, созданным в операционной памяти ПЭВМ специальной командой RAMDRIVE в ходе выполнения файла автоустановки параметров ДОС СОNFIG.SYS.

Если имя диска не указано, подразумевается устройство по умолчанию - то, которое было установлено в операционной системе перед началом работы программы. 3а именем диска может указываться имя каталога, содержащего файл. Если имени каталога предшествует обратная косая черта, то путь к файлу начинается из корневого каталога, если черты нет - из текущего каталога, установленного в системе по умолчанию. За именем каталога может следовать одно или несколько имен каталогов нижнего уровня. Каждому из них должна предшествовать обратная косая черта. Весь путь к файлу отделяется от имени файла обратной косой чертой. Максимальная длина имени вместе с путем - 79 символов.

Пример: программа создает на диске C файл, содержащий возрастающие числа, закрывает файл, открывает его и полностью выводит его содержимое (в виде чисел).
Var
  Num: file of Byte;
  i:byte;
Begin
  Assign(Num,'C:\Numbers.num');
  Rewrite(Num);
  For i:=0 to 255 do
    Write(Num,i);
  Close(Num);
  Assign(Num,'C:\Numbers.num');
  Reset(Num);
  Repeat
    Read(Num,i);
    Writeln(i);
  Until Eof(Num);
End.

4. Логические устройства

Стандартные аппаратные средства ПЭВМ, такие как клавиатура, экран терминала, печатающее устройство (принтер) и коммуникационные каналы ввода-вывода, определяются в Турбо-Паскале специальными именами, которые называются логическими устройствами. Все они в Турбо-Паскале рассматриваются как потенциальные источники или приемники текстовой информации.

СОN означает консоль - клавиатуру или экран терминала. Турбо- Паскаль устанавливает различие между этими физическими устройствами по направлению передачи данных: чтение данных возможно только с клавиатуры, а запись данных - только на экран. Таким образом, с помощью логического устройства СОN нельзя, например, прочитать данные с экрана ПЭВМ, хотя такая аппаратная возможность существует.

Ввод с клавиатуры буферируется: символы по мере нажатия на клавиши помещаются в специальный строковый буфер, который передается программе только после нажатия на клавишу "Ввод". Сам символ "Ввод" (код 13) в буфер не помещается и программе не передается. Буферизация ввода обеспечивает возможность редактирования вводимой строки стандартными средствами ДОС. При вводе символов осуществляется их эхо-повтор на экране ПЭВМ. В Турбо-Паскале можно прочитать любой символ клавиатуры, в том числе и "Ввод", сразу после нажатия на соответствующую клавишу без эхо- повтора.

PRN - логическое имя принтера. Если к ПЭВМ подключено несколько принтеров, доступ к ним осуществляется по логическим именам LРТ1, LРТ2 и LРТЗ. Имена РRN и LРТ1 первоначально синонимы. Средствами ДОС можно переназначить имя РRN на любое другое логическое устройство, способное принимать информацию.

Стандартный библиотечный модуль PRINTER, входящий в библиотеку ТURВО.ТРL, объявляет имя файловой переменной LST и связывает его с логическим устройством LРТ1. Это дает возможность использовать простое обращение к принтеру.

АUХ - логическое имя коммуникационного канала, который обычно используется для связи ПЭВМ с другими машинами. Коммуникационный канал может осуществлять и прием, и передачу данных, однако в Турбо-Паскалевой программе в каждый момент времени ему можно назначить только одну из этих функций. Как правило, в составе ПЭВМ имеются два коммуникационных канала, которым даются имена логических устройств СОМ1 и СОМ2. Первоначально имена АUХ и СОМ1 синонимы.

NUL - логическое имя "пустого" устройства. Это устройство чаще всего используется в отладочном режиме и трактуется как устройство неограниченной емкости - приемник информации. При обращении к NUL как к источнику информации выдается признак конца файла ЕОF.

Связывание логического устройства с файловой переменной осуществляется процедурой ASSIGN(< файловая переменая >, '< имя файла >').

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

5. Инициализация файла

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

Для чтения файл инициируется с помощью процедуры:
RESET (< ф.п. >);
Здесь < ф.п. > - файловая переменная, связанная ранее процедурой ASSIGN() с уже существующим файлом или логическим устройством - источником информации.

При выполнении этой процедуры дисковый файл или логическое устройство подготавливается к чтению информации. Внутренняя Турбо- Паскалевая переменная-указатель, связанная с этим файлом, указывает на начало файла, т.е. на компонент с порядковым номером 0.

Если делается попытка инициировать чтение из несуществующего файла или логического устройства РRN, возникает ошибка периода исполнения, которая может быть сообщена программе с помощью встроенной функции IORESULT типа WORD, которая в этом случае имеет ненулевое значение. (Можно выяснить, существует ли требуемый файл на диске).

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

Встроенная процедура REWRITE(< ф.п. >) инициирует запись информации в файл или логическое устройство, связанное ранее с файловой переменной < ф.п. >. Процедурой REWRITE нельзя инициировать запись информации в ранее существовавший дисковый файл: при выполнении этой процедуры старый файл уничтожается и никаких сообщений об этом в программу не передается. Новый файл подготавливается к приему информации и его указатель устанавливается в нуль.

Встроенная процедура АРРЕND(< ф.п. >) инициирует запись в ранее существовавший текстовый файл для его расширения - указатель файла устанавливается в его конец. Не следует забывать, что процедура АРРЕND применима только к текстовым файлам. Если текстовый файл ранее уже был открыт с помощью RESET или REWRITE, использование процедуры APPEND приведет к закрытию этого файла и открытию ею вновь, но уже для добавления записей.

6. Процедуры и функции для работы с файлами

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

CLOSE(< ф.п. >)
Закрывает файл, однако связь файловой переменной с именем файла, установленная ранее процедурой АSSIGN(), сохраняется.
Поскольку связь файла с файловой переменной сохраняется, файл можно повторно открыть без дополнительного использования процедуры ASSIGN.

RENAME (< ф.п. >, < новое имя >)
Переименовывает файл < ф.п. >.
Перед выполнением процедуры необходимо закрыть файл, если он ранее был открыт.

ERASE(< ф.п. >).
Уничтожает файл < ф.п. >

FLUSH(< ф.п. >).
Очищает внутренний буфер файла и, таким образом, гарантирует сохранение всех последних изменений файла на диске.
Любое обращение к файлу в Турбо-Паскале осуществляется через некоторый внутренний буфер, что необходимо для согласования bmsrpemmecn представления файлового компонента - записи с принятым в ДОС форматом хранения данных на диске. В ходе выполнения процедуры FLUSH все новые записи будут действительно записаны на диск. Процедура игнорируется, если файл был инициирован для чтения процедурой RESET.

Функция ЕОF(< ф.п. >): BOOLEAN.
Логическая функция, тестирующая конец файла. Возвращает ТRUE, если файловый указатель стоит в конце файа. При записи это означает, что очередной компонент будет добав лен в конец файла, при чтении - что файл исчерпан.

MKDIR(< имя каталога >).
Создает новый каталог на указанном диске.
Имя уже существующего каталога не может быть последним именем в пути, т.е. именем вновь создаваемого каталога.