Теоретический материал: файловый ввод-вывод (Паскаль)

Типизированные файлы

Определение. Типизированный файл - последовательность элементов одного типа.

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

Описание файлового типа для работы с типизированным файлом имеет синтаксис:

file of < тип элементов>;

Допустим, мы имеем дело с файлом, в котором записываются переменные типа Word, тогда переменная файлового типа может быть введена двояко – с явным объявлением файлового типа:

Type
  WordFile = file of word;
Var
  MyFile : WordFile;

или без объявления файлового типа:

Var
  MyFile : file of word;

Приведем примеры переменных файлового типа с другими объявлениями:

Type
  Student = record
      Name, SurName : string;
      YearsOld : byte;
      Sessia : array [1..10] of byte;
    end;
Var
  VarFile1 : file of char;
  VarFile2 : file of Student;
  VarFile3 : file of string;

Напомним, что файловые переменные имеют специфическое применение: их можно использовать только для выполнения операций с файлами (чтения, записи, удаления файла и т.д.) и получения информации о конкретном файле (тип, параметры, имя файла и т.д.).

Работа с файлами заключается в записи и считывании его компонентов. Для того, чтобы определить, какие данные будут участвовать в операции, используется неявно заданная переменная – указатель на текущий элемент файла. При открытии файла процедурами reset, rewrite указатель устанавливается на его начало. Запись и чтение производятся поэлементно, причем в них участвует тот элемент файла, на который "смотрит" указатель. В результате выполнения действия указатель перемещается к следующему элементу.

Пример. Приведем шаблон программы для записи данных в типизированный файл.

Program Writing;
Var
  FileName : string; {строка, содержащая имя файла}
  FVar : file of byte; {переменная файлового типа}
  Index : byte;
Begin
  write ('Введите имя файла ');{предложение ввести имя файла}
  readln (FileName);{ввод имени файла}
  assign (FVar, FileName);{связь имени файла и переменной}
  rewrite (FVar);{открытие файла для записи}
  for Index := 0 to 99 do {цикл для расчетов и вывода данных в файл}
    write (FVar,Index);{запись в файл FVar величины Index}
  close (FVar); {закрытие файла}
End.

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

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

Задание 1. Наберите предложенную выше программу и дополните ее выводом на экран элементов файла (воспользуйтесь процедурой считывания из файла read и вывода на экран write).

Задание 2. Создайте программу записи и чтения типизированного файла типа string.

Примеры решения задач

Рассмотрите примеры решения задач. Наберите тексты программ, проверьте их. Обратите внимание на комментарий. Выполните задания к задачам.

Задача 1. Дан файл, элементами которого являются целые числа. Найти среднее арифметическое элементов файла.

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

Задание. Дополните программу созданием типизированного файла file.dat. Добавленные строчки программы прокомментируйте.

Program Srednee;
Uses
  Crt;
Var
  Kol,
  Element,{переменная для хранения очередного элемента файла}
  Summa {переменная для хранения суммы элементов файла}
    :integer;
  f : file of integer;
  SrAriph : real;
Begin
  ClrScr;
  assign(f,'file.dat');{связываем файловую переменную f с физическим файлом file.dat}
  reset(f);{открываем файл для чтения}
  Summa :=0;{обнуление суммы}
  Kol :=0;{обнуление количества элементов}
  while not Eof(f) do{просматриваем файл до конца}
    begin
      read(f, Element);{считываем из файла очередной элемент в переменную Element}
      Inc(Kol);{увеличиваем счетчик количества элементов файла}
      Inc(Summa, Element);{увеличиваем переменную Summa на Element}
    end;
  if Kol > 0 then
    begin
      SrAriph := Summa/Kol;{вычисляем среднее арифметическое чисел}
      write('Среднее арифметическое элементов файла равно ', SrAriph:5:2);
    end
  else
      write('Файл пуст');
  close(f);{закрываем файл}
  readln;
End.

Задача 2. Наберите на компьютере и проанализируйте текст программы, сформулируйте решаемую в ней задачу, дополните необходимыми операторами и комментарием.

Program FileString;
Uses
  Crt;
Var
  f, g : file of string;
  str1, str : string;
  i : integer;
Begin
  ClrScr;
  Str1 := '';
  assign(f,'f');
  rewrite(f);
  assign(g,'g');
  rewrite(g);
  repeat
    readln(str);
    write(f,str);
    for i:=length(str) downto 1 do
      str1:=str1+str[i];
    write(g,str1);
    str1:='';
  until str='';
  close(f);
  close(g);
  assign(f,'f');
  reset(f);
  assign(g,'g');
  reset(g);
  while not eof(f) do
    begin
      read(f,str);
      writeln(str);
    end;
  while not eof(g) do
    begin
      read(g,str);
      writeln(str);
    end;
  close(f);
  close(g);
  readln;
End.

Задача 3. Создать типизированный файл, содержащий информацию о работниках института.

Задание. Дополнить текст программы

  • нахождением среднего стажа работы в институте;


  • выводом фамилий работников, работающих инженерами;


  • выводом фамилий работников, начинающихся с заданной пользователем буквы;


  • выводом фамилий работников, у которых оклад больше заданного пользователем числа;


  • выводом фамилий работников предпенсионного возраста.
Program TipRecord;
Uses
  Crt;
Type
  Dann=record
      stag : byte;
      Surname, WorkName : string;
      Oklad, Year : integer;
    End;
Var
  Spisok : file of Dann; {файл типа записи Dann}
  Man : Dann; {переменная типа записи Dann для работы с файлом}
  Name : string[12]; {строка для хранения имени физического файла}
Procedure VvodZap (Nomer : integer);
Begin
  with Man do
    begin
      writeln('Введите данные ',Nomer,'-го работника');
      write('Фамилия: ');
      readln(Surname);
      write('Год рождения: ');
      readln(Year);
      write('Стаж работы: ');
      readln(stag);
      write('Должность: ');
      readln(WorkName);
      write('Оклад: ');
      readln(oklad);
      write(Spisok, Man); {записать в файл созданный элемент Man}
    end;
End;
Procedure FileVvod;
Var
  i, count : Integer;
Begin
  write('Введите имя файла данных:');
  readln(Name); {имя физического файла}
  assign(Spisok, Name); {связываем файловую переменную с файлом}
  rewrite(Spisok ); {открываем файл для записи}
  write('Введите количество работников:');
  readln(count);
  for i:=1 to count do
    VvodZap(i); {вызов процедуры ввода очередной информации в файл}
  close(Spisok); {закрываем файл}
  readln;
End;
Begin
  ClrScr;
  FileVvod;
  readLn;
End.