В этом выпуске:
По моему личному наблюдению многие из тех, кто изучает Pascal (насчет других языков сказать не могу), чуть как-то побаиваются работать с файлами. Не понятно, чем это вызвано. На самом деле здесь нет ничего страшного. И чтобы вы это поняли, попробуем изучить этот раздел.
Вообще файлы - очень полезная штука. Например, вы написали какую-то программу, результаты работы которой вам необходимы для дальнейшей работы. Естественно их надо где-то сохранить, оперативная память для этого не подходит (хранит только временную информацию). Самый удобный вариант - это сохранить их в ПЗУ, т.е. в файл. Еще один плюс файлов это то, что вы можете не знать какой объем информации у вас получится, а файл "все стерпит".
И в Pascal'е, как и в любом уважающем себя языке, есть возможность работы с файлами.
Для начала надо сказать, что в Pascal'е все операции с файлами осуществляются через переменные файлового типа. Сами файлы могут быть трех видов: типизированные, не типизированные и текстовые. Объявляются файловые переменные в блоке описания переменных (как и любые другие переменные). Например:
... Type TAnyType = record a : byte; b : real; end; TArray = array [1..10] of byte; ... var ... {типизированный файл} F1 : file of integer; F2 : file of TAnyType; F3 : file of TArray; {не типизированный файл} F4 : file; {текстовый файл} F3 : text; ...
Следует помнить, что не существует "файла файлов" и "файла объектов", т.е. объявления типа
F1 : file of file; F2 : file of text; F3 : file of TObject;
вызовут ошибку компиляции.
В теле программы файловую переменную необходимо связать с конкретным физическим файлом на диске. Делается, это с помощью процедуры Assign. Ее заголовок:
Procedure Assign(var F; FName : string);
здесь F - любая файловая переменная, FName - путь и имя файла, с которым мы связываем переменную F.
Если в качестве параметра FName передать пустую строку, то переменная F будет связана со стандартным устройством ввода (обычно клавиатура) либо со стандартным устройством вывода (обычно дисплей).
Теперь для доступа к файлу, с которым связана файловая переменная, его необходимо открыть (если вы попытаетесь открыть файл, не связав его ни с чем, то возникнет ошибка времени выполнения). И тут возможны следующие варианты: открыть файл для чтения, для записи, для записи и чтения одновременно.
Начнем по порядку.
Если эту процедуру применить к текстовому файлу, то он будет открыт только для чтения. В случае применения ее к типизированному или нетипизированному файлу, он будет открыт как для чтения так и для записи. Заголовок процедуры Reset:
procedure Reset(var F [: File; Recsize: Word ] );
здесь F - файловая переменная любого типа, связанная с помощью процедуры Assign с некоторым файлом.
RecSize - необязательный параметр, который можно записать только если F - нетипизированная файловая переменная. Этот параметр указывает размер записи, которым будет осуществляться передача данных. Если этот параметр не указан, то длина чтения/записи данных принимается равной 128 байтам. Об этом мы поговорим в последующих выпусках.
Если F была связана с пустой строкой ( Assign(F, '') ), то, открыв ее для чтения, мы свяжем ее со стандартным устройством ввода.
Если применить эту процедуру к текстовому файлу, то он будет открыт только для записи. Если применить к типизированному или нетипизированному файлу, то он будет открыт как для чтения, так и для записи. Если файл, с которым была связан файловая переменная не существует, то он будет тут же создан, если существует, то он будет открыт, а вся информация в нем удалится. Заголовок этой процедуры:
procedure Rewrite(var F: File [; Recsize: Word ] );
здесь параметры F и Recsize играют ту же роль, что и в процедуре Reset.
procedure Append(var f: Text);
здесь F - переменная текстового типа. Эта процедура добавляет строки в текстовый файл. Подробней о ней мы поговори мпозже.
В конце программы, когда вы закончили работу с данным файлом его обязательно надо закрыть. Делается это с помощью процедуры Close. Ее заголовок:
procedure Close(var F);
здесь F - переменная файлового типа, которая была открыта с помощью одной из процедур описанных выше.
В теле программы вы можете несколько раз открыть один и тот же файл несколько раз, а также связывать одну и тужу переменную с разными файлами. Главное не забывать каждый раз закрывать файл.
Применяйте процедуры Reset и Append к уже существующим файлам. О том как обрабатывать ошибки ввода/вывода мы поговорим в следующий раз.
А вот вам программка для практики, не удивляйтесь, если встретите что-то незнакомое, мы все подробно рассмотрим.
Uses CRT; const FName = 'Hello.txt'; Var F1 : text; F2 : file of char; F3 : file of byte; st : string; ch : char; b : byte; begin ClrScr; Writeln('Введите текст.'); WriteLn('Конец ввода строки - Enter'); WriteLn('Завершение ввода - пустая строка'); Assign(F1, FName); Rewrite(F1); Repeat ReadLn(st); WriteLn(F1, st); until st=''; Close(F1); WriteLn('Нажмите любую клавишу ...'); ClrScr; Assign(F2, FName); Reset(F2); WriteLn('Этот же файл, как файл символов:); WriteLn; While not EOF(F2) do begin Read(F2, ch); Write(ch); end; Close(F2); WriteLn; WriteLn('Нажмите любую клавишу ...'); ReadKey; ClrScr; Assign(F3, FName); Reset(F3); WriteLn('Этот же файл, как файл байт:'); WriteLn; While not EOF(F3) do begin Read(F3, b); Write(b, ' '); end; Close(F3); WriteLn; WriteLn('Нажмите любую клавишу ...'); ReadKey; ClrScr; end.
Вкратце скажу, что здесь мы вводим с клавиатуры текст, записываем его в файл, затем выводим его посимвольно, а затем выводим коды каждого символа в этом файле. Файл Hello.txt создан в рабочей папке вашего Pascal'я, и вы можете просмотреть в любом текстовом редакторе (томже Pascal'е).Кстати, если в третьем цикле вместо Write(b, ' '); вы запишите, Write(chr(b)); , то ..., впрочем посмотрите сами.
Всего доброго.
© Чарышкин Олег