Каталог Индекс раздела
Назад Оглавление Вперед

Лабораторная работа N 8
ФАЙЛЫ

1. ЦЕЛЬ РАБОТЫ: изучение файловых типов данных, приобретение практических навыков создания и обработки файлов.

2. ОСНОВНЫЕ ПОНЯТИЯ

ФАЙЛ - это упорядоченная последовательность однотипных компонентов, расположенных на внешнем носителе. Файлы предназначены только для хранения информации, а обработка этой информации осуществляется программами. Использование файлов целесообразно в случае:

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

Все файлы должны быть описаны в программе либо в разделе переменных VAR, либо в разделе типов TYPE. Под чтением файла понимают ввод данных из внешнего файла, находящегося на диске, в оперативную память машины. Запись в файл - вывод результатов работы программы из оперативной памяти на диск в файл.

Работа с файлами выполняется следующими процедурами:

Для определения конца файла используется стандартная встроенная функция EOF(<файловая переменная>), которая принимает значение True, если достигнут конец файла, и значение False в противном случае.

2.1. Текстовые файлы

Текстовые файлы - файлы на диске, состоящие из символов ASCII. Для разделения строк используются символы <конец строки>. Текстовые файлы являются файлами с последовательным доступом. В любой момент времени доступна только одна запись файла. Другие записи становятся доступными лишь в результате последовательного продвижения по файлу. Текстовые файлы внутренне разделены на строки, длины которых различны. Для разделения строк используется специальный маркер конца строки. Объявляются текстовые файлы переменной типа text. Обрабатывать их можно только последовательно и с помощью процедур и функций:

Пример 1. Создать текстовый файл, в который записать 3 предложения. Прочитать этот файл, вывести его содержимое на экран. Определить длину каждого предложения.

Program File_text;
   var
      f1 : text;
      st : string;
      n: byte;
 begin
   assign   (f1, 'file1.txt'); {связать с файлом file1.txt  файловую переменную f1  }  
   rewrite  (f1); { создать новый файл  с именем file1.txt }
   writeln ( f1, 'Очень полезно изучать'); { записать предложения в файл}
   writeln ( f1, ' всем  студентам ');
   writeln (f1, ' язык  Pascal ');
   close (f1);    { закрыть файл для записи }
   reset (f1); { открыть файл для чтения }
   while not eof (f1) do { пока не конец файла  f1}
     begin
        readln (f1, st);    {читаем строку из файла f1 }
        writeln(st);         { выводим на экран }
        n:= length (st);     {определяем длину строки }
        writeln ('  длина =',n);
      end;
    close (f1); { закрыть файл  для чтения}
end.

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

Типизированные файлы - это файлы, состоящие из нумерованной последовательности объектов (записей) любого типа. С такими файлами можно работать в режиме прямого доступа, при котором выполняется непосредственное обращение к любой записи файла. Каждая запись файла имеет свой номер, начиная с 0 и т.д.

Процедуры и функции обработки файлов:

  1. Write и Read - записывают и читают информацию из указанного файла и перемещают указатель файла к следующей записи.
  2. Seek(<файловая переменная>, <номер записи>); процедура перемещения указателя на запись файла с заданным номером .
  3. Truncate(<файловая переменная>); процедура, усекающая файл по текущей позиции указателя файла, т.е. все записи, находящиеся после указателя файла, удаляются.
  4. Функция Filesize(<файловая переменная>); имеет тип Integer и определяет размер файла, т.е. число записей.
  5. Функция Filepos(<файловая переменная>); имеет тип Integer и возвращает текущую позицию указателя файла.

Для добавления записей в конец файла используются процедуры:

Readln (a );
Seek (f, filesize (f));
Write (f, a);

При этом указатель устанавливается за конец файла, т.к. нумерация записей начинается с нуля. После чего с помощью Write можно добавлять записи. Открывать файл можно только процедурой Reset(f).

Для того, чтобы в режиме произвольного доступа считать, а затем изменить значение записи, следует выполнить два вызова процедуры Seek. Один вызов перед операцией Read, а другой - перед операцией Write (т.к. Read после чтения записи переместит указатель к следующей записи).

Пример: Cоздать файл из списка 10 студентов с их оценками ( номер, Ф.И.О. и три оценки). Вывести его содержимое на экран, изменить фамилию студента с номером, введенным с клавиатуры, заново прочитать файл.

Program  lab6; 
Type
  wed = record      {Тип wed включает 3 поля: n, fio, bal}
     n : byte ;
     fio : string[15] ;
     bal : array [1..3] of byte;   {Поле bal - массив из 3 оценок }
  end;
Var spisok : wed ;       {Запись spicok  типа  wed}
    sp : file of wed;  {Файл записей типа wed}
procedure vvod;     { процедура создания файла}
 var i, j : byte;
 begin
   { оператор assing  находится в основной прграмме }
   rewrite ( sp);            {открытие файла для записи}
   with spisok do
      For i:=1 to 10 do begin
         n:=i;	          
         writeln(' Введите фамилию -  ',i ); readln(fio);  
         writeln(' Введите 3 оценки  ' fio );    
         For j:= 1 to 3 do readln(bal[] );
         write(sp, spisok);     { запись в файл информации о студенте}
         end;
      close (sp);      { закрытие файла для записи }
   end;
procedure print;  { процедура  чтения   и печати всего файла }
 var j : byte;
 begin
    reset ( sp); 		{открытие файла для чтения}
    writeln ('		Список студентов:  '); 
    while not eof (sp) do     
       with spisok do
          begin
             Read(sp, spisok);   {чтение данных из файла}
             write (n,'  ',fio);      {вывод записи на экран}
             For j:=1 to 3 do write(' ',bal[j]);
             writeln ;
       end;
    readln;
   close (sp) ;
   end;
procedure work;
 var num: integer;
 begin
    reset ( sp);		{открытие файла для чтения}
    writeln ('номер= ');    readln (num);
    seek (sp, num-1); {поиск записи с указанным номером (нумерация записей с 0)}
    read (sp,spisok);{чтение и перемещение указателя к след. записи}
    write ('fio='); writeln (spisok.fio);
    seek (sp,filepos(sp)-1); {возвращение к изменяемой записи }
    writeln (' Введите новую фамилию'); readln (spisok.fio);
    write (sp, spisok);  {запись в файл измененной записи}
    close (sp);
  end;
begin      {начало основной программы}
     assign (sp,'Vedom.DAT'); {связать файловую перем-ю  sp с файлом Vedom.dat}
     vvod;      print; {процедуры создания и чтения файла}     
     work;   print;   {корректировка и чтение измененного файла}
     readln
 end.

3. ВЫПОЛНЕНИЕ РАБОТЫ

  1. Разобрать и проанализировать приведенные программы.
  2. Используя подпрограммы, создать внешний файл из 7 записей, прочитать созданный файл и, применяя режим прямого доступа, выполнить задания по своему варианту.

Варианты заданий

  1. Запись имеет вид: фамилия, пол, год рождения и рост. Вывести данные о самом высоком спортсмене.
  2. Запись имеет вид: название вуза, число студентов, количество факультетов. Добавить в конец файла информацию о трех новых вузах.
  3. Запись имеет вид: название издания, газеты или журнала, стоимость одного экземпляра, количество экземпляров в год . Вывести на печать информацию о самом дешевом издании.
  4. Запись имеет вид: фамилия студента, номер зачетной книжки, 4 оценки за экзамен. Выводить информацию о всех двоечниках и корректировать ее.
  5. Запись имеет вид: фамилия спортсмена, его номер, количество набранных очков. Поменять местами в файле записи о первых двух спортсменах. *
  6. Запись имеет вид: фамилия, номер телефона, дата рождения. Внести в начало списка информацию о четырех новых знакомых.
  7. Запись имеет вид: название инструмента, число, месяц и год изготовления. Вывести на печать информацию об инструменте с самым большим сроком использования и выполнить корректировку этой записи.
  8. Запись имеет вид: номер читательского билета, автор книги, название, дата заказа. Вывести на экран содержимое файла. Поменять местами первую и последнюю записи в файле. *

* При обмене введите промежуточную переменную типа запись.

4. КОНТРОЛЬНЫЕ ВОПРОСЫ

  1. Чем отличается файл от массива?
  2. Особенности организации текстовых файлов.
  3. Что понимается под чтением, и что под записью в файл ?
  4. Типы доступа к файлам.
  5. Назначение процедуры SEEK.
  6. Привести пример корректировки К-той записи.
  7. Как определить размер файла?

Каталог Индекс раздела
Назад Оглавление Вперед