Немного о файлах. Часть 1

В этом выпуске:

  1. Для чего нужны файлы?
  2. Некоторые процедуры
  3. Программка для практики

По моему личному наблюдению многие из тех, кто изучает 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

Если эту процедуру применить к текстовому файлу, то он будет открыт только для чтения. В случае применения ее к типизированному или нетипизированному файлу, он будет открыт как для чтения так и для записи. Заголовок процедуры Reset:

procedure Reset(var F [: File; Recsize: Word ] );

здесь F - файловая переменная любого типа, связанная с помощью процедуры Assign с некоторым файлом.

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

Если F была связана с пустой строкой ( Assign(F, '') ), то, открыв ее для чтения, мы свяжем ее со стандартным устройством ввода.

Процедура Rewrite

Если применить эту процедуру к текстовому файлу, то он будет открыт только для записи. Если применить к типизированному или нетипизированному файлу, то он будет открыт как для чтения, так и для записи. Если файл, с которым была связан файловая переменная не существует, то он будет тут же создан, если существует, то он будет открыт, а вся информация в нем удалится. Заголовок этой процедуры:

    procedure Rewrite(var F: File [; Recsize: Word ] );

здесь параметры F и Recsize играют ту же роль, что и в процедуре Reset.

Процедура Append

Может быть применена только к текстовому файлу. Ее заголовок:
               procedure Append(var f: Text);

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

Процедура Close

В конце программы, когда вы закончили работу с данным файлом его обязательно надо закрыть. Делается это с помощью процедуры 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)); , то ..., впрочем посмотрите сами.

Всего доброго.

[ в начало ] [спрашивайте]

© Чарышкин Олег

 

Hosted by uCoz