В этом выпуске:
По моему личному наблюдению многие из тех, кто изучает 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)); , то ..., впрочем посмотрите сами.
Всего доброго.
© Чарышкин Олег