4617

Разработка программ, включающих данные файлового типа

Практическая работа

Информатика, кибернетика и программирование

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

Русский

2012-11-23

298 KB

7 чел.

Цель работы:

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

Содержание работы:

  1.  Программирование работы с файлами последовательного доступа.
  2.  Программирование работы с файлами произвольного доступа.
  3.  Программирование работы с текстовыми файлами.
  4.  Особенности программирования работы с файлами без типа.

Требования к отчету:

Отчет по работе должен содержать:

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

ІІ. МЕТОДИКА ВЫПОЛНЕНИЯ РАБОТЫ

1. Программирование работы с файлами последовательного доступа

Файл представляет собой структурированный тип данных, состоящий из последовательности компонентов определенного типа.

Доступ к компонентам файла осуществляется через указатель файла. При чтении или записи этот указатель автоматически перемещается к следующему компоненту и делает его доступным для обработки.

В Delphi предусмотрено два способа доступа к компонентам файла: последовательный и произвольный (прямой).

При последовательном способе доступа поиск начинается с начала файла и проверяется по очереди каждый компонент, пока не будет найден нужный.

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

Допускается значительная гибкость при работе с файлами. Например, компоненты последовательно организованного файла могут обрабатываться произвольно, а компоненты произвольного файла – последовательно.

Файлы последовательного доступа используются для решения задач, требующих поочередной обработки компонентов файла при отсутствии жестких ограничений на время решения. Работа с последовательными файлами предполагает:

  •  создание файла;
    •  обработку файла;
    •  корректировку файла.

Создание последовательного файла

Для создания последовательного файла необходимо выполнить следующие шаги:

  1.  связать файловую переменную с физическим файлом (процедура AssignFile);
  2.  открыть новый файл (процедура Rewrite);
  3.  подготовить информацию для ввода;
  4.  записать в файл компоненты (процедура Write);
  5.  закрыть созданный файл (процедура CloseFile).

Доступ к компонентам последовательного файла

Чтобы обработать хранящиеся в файле данные, необходимо получить доступ к компонентам файла. Для этого надо:

  1.  связать файловую переменную с физическим файлом (процедура AssignFile);
  2.  открыть уже существующий на диске файл (процедура Reset);
  3.  последовательно считать компоненты до нужного (оператор Read);
  4.  выполнить обработку;
  5.  закрыть файл (процедура CloseFile).

Корректировка последовательного файла

Возможны три вида корректировки последовательного файла:

  1.  расширение файла за счет внесения новых компонентов;
  2.  полная замена содержимого записи;
  3.  корректировка значений полей отдельных записей.

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

Расширение файла предполагает выполнение следующих шагов:

  1.  связать файловую переменную с физическим файлом (процедура AssignFile);
  2.  открыть уже существующий на носителе файл (процедура Reset);
  3.  установить указатель файла за последним компонентом;
  4.  подготовить информацию для нового компонента;
  5.  записать новый компонент (оператор Write);
  6.  закрыть файл (процедура CloseFile).

Для установки указателя за последним компонентом можно использовать процедуру:

Seek(FV,FileSize(FV));

где FV – имя файловой переменной; FileSize(FV) – длина файла

Задание № 1. Файлы последовательного доступа

1. Организовать последовательный файл с именем BIBL.DAT на диске D:\LZ-05\Zadan_1.

Структура записи следующая:

  •  порядковый номер книги;
    •  автор книги;
    •  название книги;
    •  издательство;
    •  количество страниц.

Значения полей вводятся с клавиатуры.

Признак окончания ввода – ввод значения 9999 в поле номера.

Блок организации файла оформить процедурой Org.

2. Вывести на экран содержание всех записей созданного файла. Блок вывода оформить процедурой Obr.

3. Расширить файл BIBL.TXТ двумя новыми компонентами. Блок корректировки файла оформить процедурой Korr.

4. Объединить все процедуры в одной программе и проверить ее работу во всех режимах.

Технология работы

  1.  На диске D: создайте папку LZ-05, а в ней – папку Zadan_1.
  2.  Откройте текстовый редактор Блокнот (Пуск Программы Стандартные Блокнот).
  3.  Не вводя ничего, выполните команды меню Файл Сохранить как. В открывшемся диалоговом окне Сохранить как в поле Папка найдите созданную папку Zadan_1, а в поле Имя файла введите bibl.dat и нажмите кнопку Сохранить.
  4.  В разделе определения объектов опишите структуру записей файла; определите файловую переменную, через которую программа будет связываться с физическим файлом на диске; определите переменную, описывающую запись. Это можно сделать, например, так:

Type

 Books = record                  // Запись типа Books

           Nomer: integer;       //Номер книги

           Avtor: string[20];    //Автор

            Nazv: string[40];    //Название книги

           Izdat: string[15];    //Издательство

             Str: integer;       //Количество страниц

         end;

Var

 BooksFile: file of Books;       //Файловая переменная

  RecBooks: Books;               //Переменная для записи

  1.  В процедуре организации последовательного файла необходимо предусмотреть:
    •  связывание файловой переменной с физическим файлом на диске с помощью процедуры AssignFile(BooksFile,'D:\LZ-05\Zadan1\bibl.dat');;
    •  создание нового файла на диске с помощью процедуры Rewrite(BooksFile);;
    •  ввод значений полей записей с клавиатуры с помощью процедур Readln, при этом, если вводимый номер книги окажется равным 9999, то прекратить ввод, закрыть созданный файл процедурой CloseFile(BooksFile); и выйти из процедуры организации последовательного файла с помощью процедуры Exit;
    •  запись значений в файл осуществляется процедурой Write(BooksFile, RecBooks);.

Процедура организации последовательного файла должна иметь следующий вид:

//Процедура организации последовательного файла

//Выход из процедуры - ответ 9999 для поля Nomer

Procedure Org;

Begin

 //Связывание файловой переменной с физическим файлом

 AssignFile(BooksFile,'D:\LZ-05\Zadan1\bibl.dat');

 Rewrite(BooksFile);  //Создание на диске нового файла для записи

 while True do

   begin

     Writeln('Vvedite nomer knigi');

     Readln(RecBooks.Nomer);

     if RecBooks.Nomer = 9999 then  {Если номер книги равен 9999, то выход из процедуры}

       begin

         CloseFile(BooksFile);    //Закрытие файла

         Exit                     //Выход из процедуры

       end;

     //Ввод исходных данных

     Writeln('Vvedite familiu avtora');

     Readln(RecBooks.Avtor);

     Writeln('Vvedite nazvanie knigi');

     Readln(RecBooks.Nazv);

     Writeln('Vvedite nazvanie izdatelstva');

     Readln(RecBooks.Izdat);

     Writeln('Vvedite kolichestvo stranic');

     Readln(RecBooks.Str);

     Write(BooksFile, RecBooks)   //Ввод очередной записи в файл

   end

end;

  1.  Для вывода на экран содержимого всех записей, помещенных в файл, необходимо предусмотреть:
    •  связывание файловой переменной с физическим файлом на диске с помощью процедуры AssignFile(BooksFile,'D:\LZ-05\Zadan1\bibl.dat');;
    •  установку указателя компонент файла в начало файла (т.е. на нулевую запись) с помощью процедуры Reset(BooksFile);;
    •  чтение всех записей с помощью процедуры Read(BooksFile, RecBooks);, пока не будет достигнут конец файла (последнее проверяется с помощью функции EOF(BooksFile);
    •  вывод на экран значений прочитанных записей с помощью процедуры Writeln;
    •  закрытие файла процедурой CloseFile(BooksFile).

Процедура организации последовательного файла должна иметь следующий вид:

//Процедура доступа к записям последовательного файла

Procedure Obr;

begin

 AssignFile(BooksFile,'D:\LZ-05\Zadan1\bibl.dat');

 Reset(BooksFile);   //Установка указателя в начало файла

 while not EOF(BooksFile) do  {Пока не достигнут конец файла, читать записи и выводить их на экран}

   begin

     Read(BooksFile, RecBooks);

     Writeln(RecBooks.Nomer:5,RecBooks.Avtor:10,RecBooks.Nazv:40,

             RecBooks.Izdat:15,RecBooks.Str:5)

   end;

 CloseFile(BooksFile)

end;

  1.  В процедуре добавления в конец существующего файла новых записей необходимо предусмотреть:
    •  связывание файловой переменной с физическим файлом на диске с помощью процедуры AssignFile(BooksFile,'D:\LZ-05\Zadan1\bibl.dat');;
    •  открытие существующего файла с помощью процедуры Reset(BooksFile);;
    •  установка указателя за последним компонентом существующего файла с помощью процедуры Seek(BooksFile,FileSize(BooksFile));
    •  дальнейшая работа по вводу значений новых записей осуществляется аналогично первой процедуре создания последовательного файла.

Процедура корректировки последовательного файла должна иметь следующий вид:

//Процедура корректировки последовательного файла

Procedure Korr;

begin

 AssignFile(BooksFile,'D:\LZ-05\Zadan1\bibl.dat');

 Reset(BooksFile);     //Открытие существующего файла

 Seek(BooksFile,FileSize(BooksFile)); {Установка указателя за последним компонентом существующего файла}

 while True do     //Ввод новых записей

   begin

     Writeln('Vvedite nomer knigi');

     Readln(RecBooks.Nomer);

     if RecBooks.Nomer = 9999 then  {Если номер книги равен 9999, то выход из процедуры}

       begin

         CloseFile(BooksFile);    //Закрытие файла

         Exit                 //Выход из процедуры

       end;

     Writeln('Vvedite familiu avtora');

     Readln(RecBooks.Avtor);

     Writeln('Vvedite nazvanie knigi');

     Readln(RecBooks.Nazv);

     Writeln('Vvedite nazvanie izdatelstva');

     Readln(RecBooks.Izdat);

     Writeln('Vvedite kolichestvo stranic');

     Readln(RecBooks.Str);

     Write(BooksFile, RecBooks)   //Ввод очередной записи в файл

   end

end;

  1.  Разработайте операторную часть программы, в которой необходимо предусмотреть:
    •  ввод с клавиатуры номера режима работы с помощью процедуры Readln(Rej);
    •  выбор необходимой процедуры в соответствии с введенным номером режима работы с помощью оператора case Rej of;
    •  выдачу на экран сообщения о неправильном наборе номера режима работы;
    •  прекращение работы программы процедурой Halt.

Операторная часть программы должна выглядеть примерно так:

Begin               //Основной блок

 while True do

   begin

     Writeln('Ukajte rejm:');

     Writeln('     1: sozdanie file');

     Writeln('     2: obrabotka file');

     Writeln('     3: rasshirenie file');

     Writeln('     4: vixod iz program');

     Readln(Rej);

     case Rej of

       1: Org;    //Вызов процедуры организации файла

       2: Obr;    //Вызов процедуры доступа к записям файла

       3: Korr;   //Вызов процедуры корректировки файла

       4: Halt    //Вызов процедуры прекращения работы программы

       else Writeln('Error! Povtorite nomer rejma')

     end;

   end;

 Readln

End.

  1.  Объедините все созданные процедуры и операторный блок в одной программе:

program Posldost;

{$APPTYPE CONSOLE}

uses

 SysUtils;

Type

 Books = record                  // Запись типа Books

           Nomer: integer;       //Номер книги

           Avtor: string[20];    //Автор

            Nazv: string[40];    //Название книги

           Izdat: string[15];    //Издательство

             Str: integer;       //Количество страниц

         end;

Var

 BooksFile: file of Books;       //Файловая переменная

  RecBooks: Books;               //Переменная для записи

       Rej: integer;             //Номер режима работы

//Процедура организации последовательного файла

//Выход из процедуры - ответ 9999 для поля Nomer

Procedure Org;

Begin

 //Связывание файловой переменной с физическим файлом

 AssignFile(BooksFile,'D:\LZ-05\Zadan1\bibl.dat');

 Rewrite(BooksFile);  //Создание на диске нового файла для записи

 while True do

   begin

     Writeln('Vvedite nomer knigi');

     Readln(RecBooks.Nomer);

     if RecBooks.Nomer = 9999 then  {Если номер книги равен 9999, то выход из процедуры}

       begin

         CloseFile(BooksFile);    //Закрытие файла

         Exit                     //Выход из процедуры

       end;

     //Ввод исходных данных

     Writeln('Vvedite familiu avtora');

     Readln(RecBooks.Avtor);

     Writeln('Vvedite nazvanie knigi');

     Readln(RecBooks.Nazv);

     Writeln('Vvedite nazvanie izdatelstva');

     Readln(RecBooks.Izdat);

     Writeln('Vvedite kolichestvo stranic');

     Readln(RecBooks.Str);

     Write(BooksFile, RecBooks)   //Ввод очередной записи в файл

   end

end;

//Процедура доступа к записям последовательного файла

Procedure Obr;

begin

 AssignFile(BooksFile,'D:\LZ-05\Zadan1\bibl.dat');

 Reset(BooksFile);   //Установка указателя в начало файла

 while not EOF(BooksFile) do  {Пока не достигнут конец файла, читать записи и выводить их на экран}

   begin

     Read(BooksFile, RecBooks);

     Writeln(RecBooks.Nomer:5,RecBooks.Avtor:10,RecBooks.Nazv:40,

             RecBooks.Izdat:15,RecBooks.Str:5)

   end;

 CloseFile(BooksFile)

end;

//Процедура корректировки последовательного файла

Procedure Korr;

begin

 AssignFile(BooksFile,'D:\LZ-05\Zadan1\bibl.dat');

 Reset(BooksFile);     //Открытие существующего файла

 Seek(BooksFile,FileSize(BooksFile)); {Установка указателя за последним компонентом существующего файла}

 while True do     //Ввод новых записей

   begin

     Writeln('Vvedite nomer knigi');

     Readln(RecBooks.Nomer);

     if RecBooks.Nomer = 9999 then  {Если номер книги равен 9999, то выход из процедуры}

       begin

         CloseFile(BooksFile);    //Закрытие файла

         Exit                 //Выход из процедуры

       end;

     Writeln('Vvedite familiu avtora');

     Readln(RecBooks.Avtor);

     Writeln('Vvedite nazvanie knigi');

     Readln(RecBooks.Nazv);

     Writeln('Vvedite nazvanie izdatelstva');

     Readln(RecBooks.Izdat);

     Writeln('Vvedite kolichestvo stranic');

     Readln(RecBooks.Str);

     Write(BooksFile, RecBooks)   //Ввод очередной записи в файл

     end

end;

Begin               //Основной блок

 while True do

   begin

     Writeln('Ukajte rejm:');

     Writeln('     1: sozdanie file');

     Writeln('     2: obrabotka file');

     Writeln('     3: rasshirenie file');

     Writeln('     4: vixod iz program');

     Readln(Rej);

     case Rej of

       1: Org;    //Вызов процедуры организации файла

       2: Obr;    //Вызов процедуры доступа к записям файла

       3: Korr;   //Вызов процедуры корректировки файла

       4: Halt    //Вызов процедуры прекращения работы программы

       else Writeln('Error! Povtorite nomer rejma')

     end;

   end;

 Readln

End.

  1.  Проверьте работу программы во всех режимах. Исходные данные для создания файла приведены в табл. 1.

Таблица 1

Nomer

Avtor

Nazv

Izdat

Str

1

Ivanenko

Introduction in Turbo Pascal

Nauka

234

2

Flenov

Programming in the system Delphi 7

Radio

662

3

Petrovec

Beginning of programming

Dialektika

428

Исходные данные для корректировки файла приведены в табл. 2.

Таблица 2

Nomer

Avtor

Nazv

Izdat

Str

4

Virt

Algorithms and structures of data

Statistika

406

5

Perminov

Programming in language of Pascal

Radio

120

  1.  Отлаженный проект программы сохраните в папке \Мои документы\ЛЗ-05\Задание1 под именем Posldost. В эту же папку скопируйте D:\LZ-05\Zadan1\bibl.dat.
  2.  По аналогии с данной программой, разработайте программу, позволяющую обрабатывать последовательный файл с именем FUTBALL.DAT на диске D:\LZ-05\Zadan_1a.

Структура записи следующая:

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

Значения полей вводятся с клавиатуры.

Признак окончания ввода – ввод значения 255 в поле номера команды.

Отлаженный проект программы сохраните в папке \Мои документы\ЛЗ-05\Задание1а под именем Futbl. В эту же папку скопируйте D:\LZ-05\Zadan1\futball.dat.

2. Программирование работы с файлами произвольного доступа

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

Работа с файлом произвольного доступа предполагает его организацию, обработку и корректировку.

Организация файла произвольного доступа

Организовать файл произвольного доступа можно двумя способами:

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

2) создать файл фиктивных записей, затем загрузить его по ключу фактическими данными; обращение к компонентам по ключу предполагает использование процедуры Seek.

Первый способ аналогичен созданию последовательного файла, поэтому рассмотрим второй способ.

Форматизация заключается во внесении в файл компонентов, значение полей которых носит фиктивный характер, например, нули или пробелы.

Доступ к компонентам файла произвольного доступа

Доступ к компонентам файла произвольного доступа может быть как последовательный, так и произвольный. Последовательный доступ не отличается от описанного в Задании № 1.

Для организации произвольного доступа используется процедура Seek. Произвольный доступ организовывается по ключу, значение которого равно порядковому номеру в файле нужного компонента. Ключ должен иметь целочисленное значение, не превышающее количество компонентов в файле.

Порядок действий при обработке файлов произвольного доступа следующий:

  1.  присвоить файлу имя (процедура AssignFile);
  2.  открыть файл (процедура Reset) и запросить ключ;
  3.  подвести указатель по ключу к нужному компоненту (процедура Seek);
  4.  считать нужный компонент (оператор Read);
  5.  выполнить обработку считанной информации;
  6.  закрыть файл (процедура CloseFile).

Корректировка файла произвольного доступа

Корректировка файла произвольного доступа заключается в изменении значений полей компонентов в целом или частично или расширении файла.

Для корректировки полей компонентов файла необходимо:

  1.  присвоить имя файлу (процедура AssignFile);
  2.  открыть корректируемый файл (процедура Reset);
  3.  подвести указатель файла к корректируемому компоненту (Seek);
  4.  считать корректируемый компонент (Read);
  5.  откорректировать нужные поля;
  6.  повторить инструкцию подвода указателя (процедура Seek);
  7.  записать откорректированный компонент (процедура Write);
  8.  закрыть файл (процедура CloseFile).

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

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

Задание № 2. Файлы произвольного доступа

1. Организовать файл произвольного доступа из N записей с именем BIBL2.DAT на диске D:\LZ-05\Zadan_2.

Формат записи аналогичен формату записи в Задании № 1.

Значения полей вводятся с клавиатуры.

Блок форматизации файла оформить процедурой Form.

Внести в файл фактические записи 3, 6, 7, 8.

Блок загрузки записей в файл оформить процедурой Zagr.

2. Вывести на экран содержание выбранных записей (6 и 7) созданного файла. Блок вывода оформить процедурой Obr.

3. Осуществить корректировку отдельных полей записи. Могут изменяться реквизиты всех полей, кроме номера книги. Блок корректировки файла оформить процедурой Korr.

4. Объединить все процедуры в одной программе и проверить ее работу во всех режимах.

Технология работы

  1.  Аналогично пунктам 1 – 3 технологии выполнения Задания № 1 создайте файл D:\LZ-05\Zadan_2\bibl2.dat.
  2.  В разделе определения объектов опишите структуру записей файла; определите файловую переменную, через которую программа будет связываться с физическим файлом на диске; определите переменную, описывающую запись. Это можно сделать, например, так:

Type

 Books = record                  // Запись типа Books

           Nomer: integer;       //Номер книги

           Avtor: string[20];    //Автор

            Nazv: string[40];    //Название книги

           Izdat: string[15];    //Издательство

             Str: integer;       //Количество страниц

         end;

Var

 BooksFile: file of Books;       //Файловая переменная

  RecBooks: Books;               //Переменная для записи

         N: integer;        //Общее количество записей в файле

    I,K,K1: integer;        //Промежуточные переменные

       Rej: integer;             //Номер режима работы

   FilName: string;         //Строка для полного имени файла

  1.  Процедура форматизации файла произвольного доступа заключается в том, что в поля всех записей вносятся фиктивные значения: числовые поля принимают значения 0, а строковые поля – пустую строку. Поэтому в этой процедуре необходимо предусмотреть:
    •  ввод полного имени создаваемого физического файла с клавиатуры процедурой Readln(FilName);
    •  связывание файловой переменной с этим физическим файлом с помощью процедуры AssignFile(BooksFile,FilName);
    •  создание нового файла на диске с помощью процедуры Rewrite(BooksFile);
    •  ввод фиктивных значений полей записей с клавиатуры с помощью процедур Readln;
    •  запись значений в файл процедурой Write(BooksFile, RecBooks);
    •  закрытие созданного форматизированного файла процедурой CloseFile(BooksFile).

Процедура форматизации файла произвольного доступа должна иметь следующий вид:

//Процедура форматизации файла произвольного доступа

Procedure Form;

begin

 Writeln('Vvedite polnoe imia sozdavaemogo fila:');

 Readln(FilName);      //С клавиатуры вводится полное имя файла

 AssignFile(BooksFile,FilName);

 Rewrite(BooksFile);   //Создание нового файла

 Writeln('Vvedite kolichestvo zapisey v file:');

 Readln(N);      //С клавиатуры вводится значение N

 for I:=1 to N do  //Заполнение записей фиктивными значениями

   begin

     RecBooks.Nomer:=0;

     RecBooks.Avtor:='';  //Пустые строки

      RecBooks.Nazv:='';

     RecBooks.Izdat:='';

       RecBooks.Str:=0;

     write(BooksFile,RecBooks)  //Запись в файл

   end;

 Writeln('Formatizacia ',N,' zapisey vipolnena');

 CloseFile(BooksFile)     //Закрытие файла

end;

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

  1.  Загрузка фактических записей в созданный файл осуществляется по ключу, в качестве которого выступает номер книги. В процедуре загрузки необходимо предусмотреть:
    •  ввод полного имени создаваемого физического файла с клавиатуры процедурой Readln(FilName);
      •  связывание файловой переменной с этим физическим файлом с помощью процедуры AssignFile(BooksFile,FilName);
        •  установку указателя в начало файла с помощью процедуры Reset(BooksFile);
        •  ввод количества вводимых фактических записей процедурой Readln(K);
        •  ввод фактических значений полей записей для заданного номера книги с клавиатуры с помощью процедур Readln;
        •  установку указателя на номер вводимой записи процедурой Seek(BooksFile,K1-1);
        •  запись в файл процедурой Write(BooksFile,RecBooks);
        •  закрытие файла процедурой CloseFile(BooksFile).

Процедура загрузки файла произвольного доступа записями должна иметь следующий вид:

//Процедура загрузки файла фактическими записями

Procedure Zagr;

begin

 Writeln('Vvedite imia zagrujaemogo po kluchu fila:');

 Readln(FilName);

 AssignFile(BooksFile,FilName);

 Reset(BooksFile);  //Указатель устанавливается в начало файла

 Writeln('Skolko zapisey budete vvodit?');

 Readln(K);  //С клавиатуры вводится количество записей

 for I:=1 to K do

   begin

     Writeln('Vvedite nomer knigi, zapis kotoroy nado zagruzit');

     Readln(RecBooks.Nomer);

     K1:=RecBooks.Nomer;

     Writeln('Vvedite familiu avtora');

     Readln(RecBooks.Avtor);

     Writeln('Vvedite nazvanie knigi');

     Readln(RecBooks.Nazv);

     Writeln('Vvedite nazvanie izdatelstva');

     Readln(RecBooks.Izdat);

     Writeln('Vvedite kolichestvo stranic');

     Readln(RecBooks.Str);

     Seek(BooksFile,K1-1);      //Указатель устанавливается

                                //на нужный компонент файла

     Write(BooksFile,RecBooks)  //Ввод очередной записи в файл

   end;

 Close(BooksFile)  //Закрытие файла

end;

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

  1.  Доступ к фактическим записям осуществляется по ключу, в качестве которого выступает номер книги. В процедуре доступа необходимо предусмотреть:
    •  ввод с клавиатуры полного имени файла процедурой Readln(FilName);
      •  связывание файловой переменной с этим файлом процедурой AssignFile(BooksFile,FilName);
        •  установку указателя в начало файла с помощью процедуры Reset(BooksFile);
        •  ввод номера записи, которую надо вывести процедурой Readln(K1); Если введенный номер книги равен 9999, то файл должен быть закрыт процедурой CloseFile(BooksFile);, а затем осуществлен выход из процедуры с помощью Exit;
        •  установку указателя на номер выводимой записи процедурой Seek(BooksFile,K1-1);
        •  чтение из файла выбранной записи процедурой Read(BooksFile,RecBooks);
        •  вывод на экран считанной записи Writeln.

Процедура доступа к фактическим записям файла произвольного доступа должна иметь следующий вид:

//Процедура доступа к фактическим записям файла

Procedure Obr;

begin

 Writeln('Vvedite imia fila:');

 Readln(FilName);

 AssignFile(BooksFile,FilName);

 Reset(BooksFile);  //Указатель устанавливается в начало файла

 while True do

   begin

     Writeln('Vvedite nomer vivodimoy zapisi:');

     Readln(K1);

     if K1=9999 then  {Если номер книги равен 9999, то выход из процедуры}

       begin

         CloseFile(BooksFile);

         Exit

       end;

     Seek(BooksFile,K1-1);  //Указатель устанавливается

                            //на нужную запись

     Read(BooksFile,RecBooks);  //Чтение записи

     //Вывод записи на экран

     Writeln(RecBooks.Nomer:5,RecBooks.Avtor:10,RecBooks.Nazv:40,

             RecBooks.Izdat:15,RecBooks.Str:5)

   end

end;

  1.  В процедуре корректировки осуществляется изменение значений всех полей кроме номера книги в выбранной по номеру записи файла. В процедуре корректировки необходимо предусмотреть:
    •  описание промежуточных переменных, используемых для определения новых значений полей;
      •  ввод с клавиатуры полного имени файла процедурой Readln(FilName);
        •  связывание файловой переменной с этим файлом процедурой AssignFile(BooksFile,FilName);
        •  установку указателя в начало файла с помощью процедуры Reset(BooksFile);
        •  ввод количества записей, которые будут корректироваться, процедурой Readln(K);
        •  ввод номера очередной корректируемой записи процедурой Readln(K1);
        •  ввод в промежуточные переменные новых значений полей;
        •  установку указателя на номер текущей корректируемой записи процедурой Seek(BooksFile,K1-1);
        •  чтение из файла выбранной корректируемой записи процедурой Read(BooksFile,RecBooks);
        •  замену значений корректируемых полей на новые значения (хранятся в промежуточных переменных) с помощью операторов присваивания;
        •  вновь установку указателя на номер текущей корректируемой записи процедурой Seek(BooksFile,K1-1);
        •  запись в файл новых значений полей корректируемой записи процедурой Write(BooksFile,RecBooks);
        •  закрытие файла процедурой Close(BooksFile).

Процедура корректировки файла произвольного доступа должна иметь следующий вид:

//Процедура корректировки файла произвольного доступа

Procedure Korr;

Var

 NewAvtor: string[20];  //Новый автор

  NewNazv: string[40];  //Новое название книги

 NewIzdat: string[15];  //Новое издательство

   NewStr: integer;     //Новое количество страниц

begin

 Writeln('Vvedite imia fila:');

 Readln(FilName);

 AssignFile(BooksFile,FilName);

 Reset(BooksFile);  //Указатель устанавливается в начало файла

 Writeln('Skolko zapisey budete korrektirovat?');

 Readln(K);

 for I:=1 to K do

   begin

     Writeln('Vvedite nomer korrektiruemoy zapisi:');

     Readln(K1);

     Writeln('Vvedite familiu novogo avtora');

     Readln(NewAvtor);

     Writeln('Vvedite novoe nazvanie knigi');

     Readln(NewNazv);

     Writeln('Vvedite novoe nazvanie izdatelstva');

     Readln(NewIzdat);

     Writeln('Vvedite novoe kolichestvo stranic');

     Readln(NewStr);

     //Установка указателя на корректируемую запись

     Seek(BooksFile,K1-1);

     Read(BooksFile,RecBooks);  //Чтение корректируемой записи

     RecBooks.Avtor:=NewAvtor;

      RecBooks.Nazv:=NewNazv;

     RecBooks.Izdat:=NewIzdat;

       RecBooks.Str:= NewStr;

     //Вновь установка указателя на корректируемую запись

     Seek(BooksFile,K1-1);

     //Запись в файл новых значений полей

     Write(BooksFile,RecBooks)  

   end;

 Close(BooksFile)  //Закрытие файла

end;

  1.  Разработайте операторную часть программы, в которой необходимо предусмотреть:
    •  ввод с клавиатуры номера режима работы с помощью процедуры Readln(Rej);
    •  выбор необходимой процедуры в соответствии с введенным номером режима работы с помощью оператора case Rej of;
    •  выдачу на экран сообщения о неправильном наборе номера режима работы;
    •  прекращение работы программы процедурой Halt.

Операторная часть программы должна выглядеть примерно так:

Begin               //Основной блок

 while True do

   begin

     Writeln('Ukajte rejm:');

     Writeln('     1: formatizacia fila');

     Writeln('     2: zagruzka fila po kluchu');

     Writeln('     3: obrabotka fila po kluchu');

     Writeln('     4: korrektirovka fila');

     Writeln('     5: vixod iz program');

     Readln(Rej);  //Ввод режима с клавиатуры

     case Rej of

       1: Form;   //Вызов процедуры организации файла

       2: Zagr;   //Вызов процедуры доступа к записям файла

       3: Obr;    //Вызов процедуры корректировки файла

       4: Korr;   //Вызов процедуры корректировки файла

       5: Halt    //Вызов процедуры прекращения работы программы

       else Writeln('Error! Povtorite nomer rejma')

     end;

   end;

 Readln

End.

  1.  Объедините все созданные процедуры и операторный блок в одной программе:

Program Proizdos;

{$APPTYPE CONSOLE}

uses

 SysUtils;

Type

 Books = record                  // Запись типа Books

           Nomer: integer;       //Номер книги

           Avtor: string[20];    //Автор

            Nazv: string[40];    //Название книги

           Izdat: string[15];    //Издательство

             Str: integer;       //Количество страниц

         end;

Var

 BooksFile: file of Books;       //Файловая переменная

  RecBooks: Books;               //Переменная для записи

         N: integer;        //Общее количество записей в файле

    I,K,K1: integer;        //Промежуточные переменные

       Rej: integer;        //Номер режима работы

   FilName: string;         //Строка для полного имени файла

//Процедура форматизации файла произвольного доступа

Procedure Form;

begin

 Writeln('Vvedite polnoe imia sozdavaemogo fila:');

 Readln(FilName);      //С клавиатуры вводится полное имя файла

 AssignFile(BooksFile,FilName);

 Rewrite(BooksFile);   //Создание нового файла

 Writeln('Vvedite kolichestvo zapisey v file:');

 Readln(N);      //С клавиатуры вводится значение N

 for I:=1 to N do  //Заполнение записей фиктивными значениями

   begin

     RecBooks.Nomer:=0;

     RecBooks.Avtor:='';  //Пустые строки

      RecBooks.Nazv:='';

     RecBooks.Izdat:='';

       RecBooks.Str:=0;

     write(BooksFile,RecBooks)  //Запись в файл

   end;

 Writeln('Formatizacia ',N,' zapisey vipolnena');

 CloseFile(BooksFile)     //Закрытие файла

end;

//Процедура загрузки файла фактическими записями

Procedure Zagr;

begin

 Writeln('Vvedite imia zagrujaemogo po kluchu fila:');

 Readln(FilName);

 AssignFile(BooksFile,FilName);

 Reset(BooksFile);  //Указатель устанавливается в начало файла

 Writeln('Skolko zapisey budete vvodit?');

 Readln(K);  //С клавиатуры вводится количество записей

 for I:=1 to K do

   begin

     Writeln('Vvedite nomer knigi, zapis kotoroy nado zagruzit');

     Readln(RecBooks.Nomer);

     K1:=RecBooks.Nomer;

     Writeln('Vvedite familiu avtora');

     Readln(RecBooks.Avtor);

     Writeln('Vvedite nazvanie knigi');

     Readln(RecBooks.Nazv);

     Writeln('Vvedite nazvanie izdatelstva');

     Readln(RecBooks.Izdat);

     Writeln('Vvedite kolichestvo stranic');

     Readln(RecBooks.Str);

     Seek(BooksFile,K1-1);      //Указатель устанавливается

                                //на нужный компонент файла

     Write(BooksFile,RecBooks)  //Ввод очередной записи в файл

   end;

 Close(BooksFile)  //Закрытие файла

end;

//Процедура доступа к фактическим записям файла

Procedure Obr;

begin

 Writeln('Vvedite imia fila:');

 Readln(FilName);

 AssignFile(BooksFile,FilName);

 Reset(BooksFile);  //Указатель устанавливается в начало файла

 while True do

   begin

     Writeln('Vvedite nomer vivodimoy zapisi:');

     Readln(K1);

     if K1=9999 then  {Если номер книги равен 9999, то выход из процедуры}

       begin

         CloseFile(BooksFile);

         Exit

       end;

     Seek(BooksFile,K1-1);  //Указатель устанавливается

                            //на нужную запись

     Read(BooksFile,RecBooks);  //Чтение записи

     //Вывод записи на экран

     Writeln(RecBooks.Nomer:5,RecBooks.Avtor:10,RecBooks.Nazv:40,

             RecBooks.Izdat:15,RecBooks.Str:5)

   end

end;

//Процедура корректировки файла произвольного доступа

Procedure Korr;

Var

 NewAvtor: string[20];  //Новый автор

  NewNazv: string[40];  //Новое название книги

 NewIzdat: string[15];  //Новое издательство

   NewStr: integer;     //Новое количество страниц

begin

 Writeln('Vvedite imia fila:');

 Readln(FilName);

 AssignFile(BooksFile,FilName);

 Reset(BooksFile);  //Указатель устанавливается в начало файла

 Writeln('Skolko zapisey budete korrektirovat?');

 Readln(K);

 for I:=1 to K do

   begin

     Writeln('Vvedite nomer korrektiruemoy zapisi:');

     Readln(K1);

     Writeln('Vvedite familiu novogo avtora');

     Readln(NewAvtor);

     Writeln('Vvedite novoe nazvanie knigi');

     Readln(NewNazv);

     Writeln('Vvedite novoe nazvanie izdatelstva');

     Readln(NewIzdat);

     Writeln('Vvedite novoe kolichestvo stranic');

     Readln(NewStr);

     //Установка указателя на корректируемую запись

     Seek(BooksFile,K1-1);

     Read(BooksFile,RecBooks);  //Чтение корректируемой записи

     RecBooks.Avtor:=NewAvtor;

      RecBooks.Nazv:=NewNazv;

     RecBooks.Izdat:=NewIzdat;

       RecBooks.Str:= NewStr;

     //Вновь установка указателя на корректируемую запись

     Seek(BooksFile,K1-1);

     //Запись в файл новых значений полей

     Write(BooksFile,RecBooks)  

   end;

 Close(BooksFile)  //Закрытие файла

end;

Begin               //Основной блок

 while True do

   begin

     Writeln('Ukajte rejm:');

     Writeln('     1: formatizacia fila');

     Writeln('     2: zagruzka fila po kluchu');

     Writeln('     3: obrabotka fila po kluchu');

     Writeln('     4: korrektirovka fila');

     Writeln('     5: vixod iz program');

     Readln(Rej);  //Ввод режима с клавиатуры

     case Rej of

       1: Form;   //Вызов процедуры организации файла

       2: Zagr;   //Вызов процедуры доступа к записям файла

       3: Obr;    //Вызов процедуры корректировки файла

       4: Korr;   //Вызов процедуры корректировки файла

       5: Halt    //Вызов процедуры прекращения работы программы

       else Writeln('Error! Povtorite nomer rejma')

     end;

   end;

 Readln

End.

  1.  Проверьте работу программы во всех режимах.

Количество записей в файле 10.

Исходные данные для создания файла приведены в табл. 2.

Таблица 2

Nomer

Avtor

Nazv

Izdat

Str

3

Ivanenko

Introduction in Turbo Pascal

Nauka

234

6

Flenov

Programming in the system Delphi 7

Radio

662

7

Petrovec

Beginning of programming

Dialektika

428

8

Virt

Algorithms and structures of data

Statistika

406

Исходные данные для корректировки файла приведены в табл. 3.

Таблица 3

Nomer

Avtor

Nazv

Izdat

Str

6

Krisevich

Programming: Delphi 7

Nauka

218

8

Perminov

Programming in language of Pascal

Radio

120

  1.  Отлаженный проект программы сохраните в папке \Мои документы\ЛЗ-05\Задание2 под именем Posldost. В эту же папку скопируйте D:\LZ-05\Zadan1\bibl2.dat.
  2.  По аналогии с данной программой, разработайте программу, позволяющую обрабатывать файл произвольного доступа с именем FUTBALL2.DAT на диске D:\LZ-05\Zadan_2a.

Структура записи следующая:

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

Значения полей вводятся с клавиатуры.

Количество записей 10.

Признак окончания ввода – ввод значения 255 в поле номера команды.

Отлаженный проект программы сохраните в папке \Мои документы\ЛЗ-05\Задание1а под именем Futbl2. В эту же папку скопируйте D:\LZ-05\Zadan1\futball2.dat.

3. Программирование работы с текстовыми файлами

Файл, компонентами которого являются данные символьного типа, называется символьным (или текстовым).

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

Имя: TextFile;

Например:

Type

 TText = TextFile;

var

  Doc1, Doc2, Kniga: TText;

либо

Var

  Doc1, Doc2, Kniga: TextFile;

В текстовых файлах помимо признака конца файла EOF используется дополнительный признак конца строки – EOL (End-of-Line), который представляет собой последовательность из двух символов кода ASCII — символа с кодом #13 («возврат каретки») и символа с кодом #10 («перевод строки»).

Текстовый файл можно представить как страницу книги, в конце каждой строки которой стоит признак EOL:

код символа

код символа

...

код символа

код символа

EOL

код символа

код символа

...

код символа

EOL

код символа

код символа

...

EOL

код символа

код символа

...

код символа

код символа

EOF

Работа с текстовым файлом предполагает его организацию, обработку и корректировку.

Организация текстового файла

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

  1.  присвоить файлу имя (процедура AssignFile);
  2.  открыть файл для записи (процедура Rewrite);
  3.  подготовить строку для записи (например, ввести с клавиатуры);
  4.  записать строку в файл (процедура Writeln);
  5.  закрыть файл (процедура CloseFile).

Доступ к компонентам текстового файла

Для обработки содержимого текстового файла необходимо получить доступ к его компонентам. Для этого следует выполнить следующее:

  1.  присвоить файлу имя (процедура AssignFile);
  2.  открыть файл для чтения (процедура Reset);
  3.  прочитать компонент файла (оператор Readln);
  4.  обработать компонент (например, распечатать);
  5.  закрыть файл (процедура CloseFile).

Корректировка текстового файла

Корректировка заключается в расширении текстового файла новыми компонентами. Для этого необходимо:

  1.  присвоить файлу имя (процедура AssignFile);
  2.  открыть файл для внесения новых компонентов(процедура Append);
  3.  записать новые компоненты (процедура Writeln);
  4.  закрыть файл (процедура CloseFile).

Задание № 3. Текстовые файлы

1. Организовать текстовый файл с именем delpism.txt на диске D:\LZ-05\Zadan_3.

Файл будет содержать строки делового письма.

Каждая строка содержит не более 60 символов.

Если значение вводимой строки равно 'zzz', то следует прекратить запись строк в файл.

Блок создания текстового файла оформить процедурой Sozdt.

2. Вывести на экран все компоненты файла. Блок вывода оформить процедурой Obrt.

3. Расширить созданный файл новыми строками. Если значение вводимой строки равно 'zzz', то прекратить запись строк в файл. Блок корректировки файла оформить процедурой Rasht.

4. Объединить все процедуры в одной программе и проверить ее работу во всех режимах.

Технология работы

  1.  Аналогично пунктам 1 – 3 технологии выполнения Задания № 1 создайте файл D:\LZ-05\Zadan_3\delpism.txt.
  2.  В разделе определения объектов опишите структуру записей файла; определите файловую переменную, через которую программа будет связываться с физическим файлом на диске; определите переменную, описывающую запись. Это можно сделать, например, так:

Type

 Dlina = string[60];    //Максимальная длина строки

Var

 Stro   : textfile;    //Файловая переменная

 FilName: string;      //Строка для полного имени файла

 S      : Dlina;       //Промежуточная строковая переменная

 Rej    : byte;        //Номер режима работы программы

  1.  В процедуре создания текстового файла необходимо предусмотреть:
    •  ввод полного имени создаваемого физического файла с клавиатуры процедурой Readln(FilName);
      •  связывание файловой переменной с этим физическим файлом с помощью процедуры AssignFile(Stro,FilName);
        •  открытие для создания нового текстового файла процедурой Rewrite(Stro);
        •  ввод фактических значений строк с клавиатуры и запись их в файл с помощью процедуры Writeln(Stro,S);
        •  закрытие файла процедурой CloseFile(Stro);, когда будет введена строка 'zzz' и выход из процедуры по команде Exit.

Процедура создания текстового файла должна иметь следующий вид:

Procedure Sozdt;

begin

 Writeln('Vvedite polnoe imia sozdavaemogo textovogo fila:');

 Readln(FilName);      //С клавиатуры вводится полное имя файла

 Assign(Stro,FilName);

 Rewrite(Stro);        //Открытие создаваемого файла

 while True do

   begin

     Writeln('Vvedite ocherednyu stroku i najmite ENTER');

     Readln(S);        //Ввод с клавиатуры очередной строки

     {Если введенная строка равна zzz, то закрыть файл и выйти из процедуры}

     if S = 'zzz' then

       begin

         CloseFile(Stro);

         Exit

       end;

     Writeln(Stro,S)  //Запись очередной строки в файл

   end

end;

  1.  В процедуре вывода строк текстового файла на экран необходимо предусмотреть:
    •  ввод полного имени создаваемого физического файла с клавиатуры процедурой Readln(FilName);
      •  связывание файловой переменной с этим физическим файлом с помощью процедуры AssignFile(Stro,FilName);
        •  открытие текстового файла процедурой Reset(Stro);
        •  чтение из файла очередной строки процедурой Readln(Stro,S);
        •  вывод прочитанной строки на экран процедурой Writeln(S).

Процедура чтения текстового файла должна иметь следующий вид:

Procedure Obrt;

begin

 Writeln('Vvedite polnoe imia textovogo fila:');

 Readln(FilName);      //С клавиатуры вводится полное имя файла

 Assign(Stro,FilName);

 Reset(Stro);          //Открытие текстового файла

 {Продолжать чтение строк, пока не будет достигнут конец файла}

 while not SeekEof (Stro) do

   begin

     Readln(Stro,S); //Чтение очередной строки из файла

     Writeln(S)      //Вывод строки на экран

   end

end;

  1.  В процедуре корректировки текстового файла необходимо предусмотреть:
    •  ввод полного имени создаваемого физического файла с клавиатуры процедурой Readln(FilName);
      •  связывание файловой переменной с этим физическим файлом с помощью процедуры AssignFile(Stro,FilName);
        •  открытие текстового файла и установка указателя на маркер конца файла (чтобы можно было расширять файл дополнительными строками) процедурой Append(Stro);
        •  дальнейшие действия выполняются аналогично командам процедуры создания текстового файла.

Процедура расширения текстового файла должна иметь следующий вид:

Procedure Rasht;

begin

 Writeln('Vvedite polnoe imia textovogo fila:');

 Readln(FilName);      //С клавиатуры вводится полное имя файла

 Assign(Stro,FilName);

 Append(Stro);

 while True do

   begin

     Writeln('Vvedite ocherednyu stroku i najmite ENTER');

     Readln(S);        //Ввод с клавиатуры очередной строки

     {Если введенная строка равна zzz, то закрыть файл и выйти из процедуры}

     if S = 'zzz' then

       begin

         CloseFile(Stro);

         Exit

       end;

     Writeln(Stro,S)  //Запись очередной строки в файл

   end

end;

  1.  Разработайте операторную часть программы, в которой необходимо предусмотреть:
    •  ввод с клавиатуры номера режима работы с помощью процедуры Readln(Rej);
    •  выбор необходимой процедуры в соответствии с введенным номером режима работы с помощью оператора case Rej of;
    •  выдачу на экран сообщения о неправильном наборе номера режима работы;
    •  прекращение работы программы процедурой Halt.

Операторная часть программы должна выглядеть примерно так:

Begin               //Основной блок

 while True do

   begin

     Writeln('Ukajte rejm:');

     Writeln('     1: sozdanie textovogo fila');

     Writeln('     2: vivod textovogo fila');

     Writeln('     3: racshirenie textovogo fila');

     Writeln('     4: vixod iz program');

     Readln(Rej);  //Ввод режима с клавиатуры

     case Rej of

       1: Sozdt;  //Вызов процедуры создания текстового файла

       2: Obrt;   //Вызов процедуры вывода файла на экран

       3: Rasht;  //Вызов процедуры расширения файла

       4: Halt    //Вызов процедуры прекращения работы программы

       else Writeln('Error! Povtorite nomer rejma')

     end;

   end;

 Readln

End.

  1.  Объедините все созданные процедуры и операторный блок в одной программе:

Program TextFiles;

{$APPTYPE CONSOLE}

uses

 SysUtils;

Type

 Dlina = string[60];    //Максимальная длина строки

Var

 Stro   : textfile;    //Файловая переменная

 FilName: string;      //Строка для полного имени файла

 S      : Dlina;       //Промежуточная строковая переменная

 Rej    : byte;        //Номер режима работы программы

//Процедура создания текстового файла

Procedure Sozdt;

begin

 Writeln('Vvedite polnoe imia sozdavaemogo textovogo fila:');

 Readln(FilName);      //С клавиатуры вводится полное имя файла

 Assign(Stro,FilName);

 Rewrite(Stro);        //Открытие создаваемого файла

 while True do

   begin

     Writeln('Vvedite ocherednyu stroku i najmite ENTER');

     Readln(S);        //Ввод с клавиатуры очередной строки

     {Если введенная строка равна zzz, то закрыть файл и выйти из процедуры}

     if S = 'zzz' then

       begin

         CloseFile(Stro);

         Exit

       end;

     Writeln(Stro,S)  //Запись очередной строки в файл

   end

end;

//Процедура вывода текстового файла на экран

Procedure Obrt;

begin

 Writeln('Vvedite polnoe imia textovogo fila:');

 Readln(FilName);      //С клавиатуры вводится полное имя файла

 Assign(Stro,FilName);

 Reset(Stro);          //Открытие текстового файла

 {Продолжать чтение строк, пока не будет достигнут конец файла}

 while not SeekEof (Stro) do

   begin

     Readln(Stro,S); //Чтение очередной строки из файла

     Writeln(S)      //Вывод строки на экран

   end

end;

//Процедура расширения текстового файла

Procedure Rasht;

begin

 Writeln('Vvedite polnoe imia textovogo fila:');

 Readln(FilName);      //С клавиатуры вводится полное имя файла

 Assign(Stro,FilName);

 Append(Stro);

 while True do

   begin

     Writeln('Vvedite ocherednyu stroku i najmite ENTER');

     Readln(S);        //Ввод с клавиатуры очередной строки

     {Если введенная строка равна zzz, то закрыть файл и выйти из процедуры}

     if S = 'zzz' then

       begin

         CloseFile(Stro);

         Exit

       end;

     Writeln(Stro,S)  //Запись очередной строки в файл

   end

end;

Begin               //Основной блок

 while True do

   begin

     Writeln('Ukajte rejm:');

     Writeln('     1: sozdanie textovogo fila');

     Writeln('     2: vivod textovogo fila');

     Writeln('     3: racshirenie textovogo fila');

     Writeln('     4: vixod iz program');

     Readln(Rej);  //Ввод режима с клавиатуры

     case Rej of

       1: Sozdt;  //Вызов процедуры создания текстового файла

       2: Obrt;   //Вызов процедуры вывода файла на экран

       3: Rasht;  //Вызов процедуры расширения файла

       4: Halt    //Вызов процедуры прекращения работы программы

       else Writeln('Error! Povtorite nomer rejma')

     end;

   end;

 Readln

End.

  1.  Проверьте работу программы во всех режимах. Для этого:
    •  в режиме 1 введите любые три строки при английской раскладке клавиатуры (число символов в строке не должно превышать 60);
    •  в режиме 3 добавьте к файлу произвольные две строки и повторите режим 2.
  2.  Отлаженный проект программы сохраните в папке \Мои документы\ЛЗ-05\Задание3 под именем TextFiles. В эту же папку скопируйте D:\LZ-05\Zadan3\delpism.txt.

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

Все файлы, рассмотренные выше, имели строго определенный тип. Однако в ряде случаев пользователь может не знать всех типов файлов, с которыми ему необходимо работать. Обычно такая ситуация возникает при копировании отдельных файлов или объединении нескольких файлов в один результирующий. Для реализации подобных случаев в языке Delphi используются файлы, не имеющие типа (нетипизированные файлы), которые совместимы со всеми типами файлов. Нетипизированные файлы описываются с помощью ключевого слова file:

Var <Файловая_переменная>: file;

Например,

Var 

 NewFile, OldFile: file;  //Бестиповые файлы

Процедуры открытия нетипизированного файла для чтения или записи (Reset и Rewrite) имеют по два параметра. Кроме имени файловой переменной, в их вызовах указывается размер внешнего буфера в байтах. Этот буфер называется блоком. Через него данные копируются из физического файла во внутренний буфер и наоборот. Размер блока может быть в пределах от 1 до 65535 байт. Например, Reset(f,128), Reset(f,1), Rewrite(g,512), Rewrite(g,1).

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

BlockRead(FV,Pr,Count,Result)

BlockWrite(FV,Pr,Count,Result);

где FV – имя файловой переменной;

     Pr – переменная любого типа (обычно это массив) – задает место в памяти, с которого начинается «внутренний буфер»;

     Count – количество блоков, которое надо прочитать из файла или записать в файл;

     Result – количество блоков, которое было передано фактически при выполнении вызова.

Например, пусть действуют такие определения:

Var 

 f: file;  //Задание файловой переменной для бестипового файла

 inbuf: array[1..100] of char;  //Буфер для ввода

 blksz: longint;                //Размер блока чтения

 nblk: longint;                 //Число блоков – желаемое

 nblkreal: longint;             //Число блоков – действительное

Тогда следующие операторы и вызовы процедур

blksz:=4;

nblk:=25;

Reset(f,blksz);

BlockRead(f,inbuf,nblk,nblkreal);

устанавливают размер блока равным 4 байтам и задают чтение 25 таких блоков из файла. Если размер файла в действительности не меньше 4*25 = 100 байт и ошибок при чтении не было, то значением переменной nblkreal является 25. После чтения массив inbuf заполнен до конца и затем обрабатывается в зависимости от конкретной задачи. Кроме того, при выполнении следующего вызова процедуры BlockRead файл f будет читаться, начиная со 101-го байта.

Возможно, в файле меньше, чем 100 байт или при чтении что-то случилось, и в действительности прочитано меньше, чем указанные 25 блоков. Тогда значение переменной nblkreal будет меньше 25.

Если задать чтение блоков, число которых меньше 25, массив inbuf заполняется не до конца, а если больше – заполнится массив inbuf и соответствующее количество переменных, расположенных после массива в памяти программы. Поскольку переменные располагаются в порядке определения, первыми «жертвами» в данном случае станут переменные blksz, nblk, nblkreal. Они имеют тип longint и занимают по 4 байта, поэтому при выполнении BlockRead(f,inbuf,26,nblkreal); будет испорчена только первая из них, при BlockRead(f,inbuf,27,nblkreal); - первые две и т.д.

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

Если обрабатывается файл записей фиксированного размера, то этот размер можно задавать и для блока. Например, записи типа

Student = record

           Sname,Name: string[30];

                 Ball: real

         end;

имеют размер 31+31+6 = 68 байт. Это значение возвращается из вызова SizeOf(Student), поэтому бестиповый файл f, связанный с файлом записей типа Student, можно открыть вызовом Reset(f,SizeOf(Student));

После этого вызов вида

BlockRead(f,Buf,n,nreal);

задает чтение n блоков по 68 байт в память переменной Buf.

Главную роль в скорости чтения бестиповых файлов играет размер внутреннего буфера. Чем он больше, тем меньше обращений к внешнему носителю и быстрее обработка файла. Тем не менее, если размер буфера кратен 512 байт и больше 8 Кбайт, скорость чтения файлов будет практически постоянной.

Процедура блочного вывода BlockWrite также имеет 4 аналогичных параметра. Отличие заключается в том, что данные из внутреннего буфера через блок записываются в конец файла. Предварительно для файла нужно установить размер внешнего буфера с помощью вызова процедуры вида ReWrite(f,m);

Задание № 4. Копирование бестипового файла с буфером

1. Организовать пустой целевой текстовый файл с именем file-c.txt на диске D:\LZ-05\Zadan_4. В этот файл будут осуществляться копирование.

2. Скопировать в эту папку D:\LZ-05\Zadan_4 файл Лекция 05 - СТРУКТУРЫ ДАННЫХ.doc из папки Технологии программирования\Модуль 2\ и переименовать его в file-i.doc.

3. Создайте программу копирования файла file-i.doc в файл file-c.txt с использованием бестиповых файлов.

Технология работы

  1.  Аналогично пунктам 1 – 3 технологии выполнения Задания № 1 создайте файл D:\LZ-05\Zadan_4\file-c.txt.
  2.  Скопируйте в папку D:\LZ-05\Zadan_4 файл Лекция 05 - СТРУКТУРЫ ДАННЫХ.doc из папки Технологии программирования\Модуль 2\ и переименуйте его в file-i.doc.
  3.  Запустите следующую программу:

program QuickCopy;

{$APPTYPE CONSOLE}

uses

 SysUtils;

const Bufsz=32768;    //Размер буфера

var f,g: file;        //Файловые переменные исходного и целевого файлов

   Buf: array[1..Bufsz] of char;  //Буфер

   restfile: longint;  //Размер остатка файла

   portion: longint;   //Размер очередной порции

   rdin: longint;      //Число реально прочитанных байтов

   wrou: longint;      //Число реально записанных байтов

   s_i, s_c: string;   //Внешние имена исходного и целевого файлов

begin

 Writeln('Vvedite imia fila-istochnika:');

 Readln(s_i);

 AssignFile(f,s_i);

 Writeln('Vvedite imia celevogo fila:');

 Readln(s_c);

 AssignFile(g,s_c);

 Reset(f,1);

 Rewrite(g,1);

 restfile:=FileSize(f);  //Число байт для копирования

 while restfile > 0 do

   begin

     if restfile > Bufsz then portion:=Bufsz

                         else portion:=restfile;

     //Остаток уменьшается на размер скопированной порции

     dec(restfile,portion);

     Blockread(f,Buf,portion,rdin);

     if rdin <> portion then

       begin

         Writeln('Error chtenia fila');

         Halt

       end;

     Blockwrite(g,Buf,portion,wrou);

     if wrou <> portion then

       begin

         Writeln('Error zapisi fila');

         Halt

       end;

   end;

 CloseFile(g);

 CloseFile(f);

 Readln

end.

  1.  Проверьте ее работу и самостоятельно опишите действия, которые осуществляются в этой программе.
  2.  Отлаженный проект программы сохраните в папке \Мои документы\ЛЗ-05\Задание4 под именем QuickCopy. В эту же папку скопируйте из D:\LZ-05\Zadan4\delpism.txt файлы file-c.txt и file-i.doc.

ВЫВОДЫ

  1.  Файл представляет собой структурированный тип данных, состоящий из последовательности компонентов определенного типа. Доступ к компонентам файла осуществляется через указатель файла. В Delphi предусмотрено два способа доступа к компонентам файла: последовательный и произвольный (прямой). При последовательном способе доступа поиск начинается с начала файла и проверяется по очереди каждый компонент, пока не будет найден нужный. Произвольный способ доступа позволяет обращаться к компоненту по его порядковому номеру в файле.
  2.  Файлы последовательного доступа используются для решения задач, требующих поочередной обработки компонентов файла при отсутствии жестких ограничений на время решения. Работа с последовательными файлами предполагает: создание файла, обработку файла и корректировку файла.
  3.  Файлы произвольного доступа создаются для решения задач, требующих оперативного доступа к хранимой информации или при наличии зависимости значения поля компонента от порядкового номера компонента в файле. Последовательный доступ в этих случаях неэффективен. Работа с файлом произвольного доступа предполагает его организацию, обработку и корректировку.
  4.  Файл, компонентами которого являются данные символьного типа, называется символьным (или текстовым). В текстовых файлах помимо признака конца файла EOF используется дополнительный признак конца строки – EOL (End-of-Line). Работа с текстовым файлом предполагает его организацию, обработку и корректировку.
  5.  В ряде случаев пользователь может не знать всех типов файлов, с которыми ему необходимо работать. Обычно такая ситуация возникает при копировании отдельных файлов или объединении нескольких файлов в один результирующий. Для реализации подобных случаев в языке Delphi используются файлы, не имеющие типа (нетипизированные файлы), которые совместимы со всеми типами файлов.

Контрольные вопросы

  1.  Опишите процесс создания файла последовательного доступа.
  2.  Как осуществляется доступ к компонентам последовательного файла?
  3.  Как осуществляется корректировка последовательного файла?
  4.  Чем отличается доступ к компонентам файла произвольного доступа от доступа к компонентам последовательного файла?
  5.  Как осуществляется корректировка компонентов файла произвольного доступа?
  6.  Как осуществляется организация текстового файла?
  7.  Опишите процедуру корректировки текстового файла.
  8.  С какой целью используются файлы без типа?
  9.  Какие новые процедуры используются для работы с файлами без типа?

Задание на самостоятельную работу

  1.  Изучить материал лабораторного занятия, представленный в электронной форме.
  2.  Выполнить все предусмотренные задания.
  3.  Ответить на контрольные вопросы.
  4.  

Приложение А

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

Для организации эффективной и удобной работы с файлами в языке Delphi предусмотрен ряд процедур и функций. При их описании используются следующие обозначения:

FV – файловая переменная;

Str – строковое выражение;

Р – переменные p1, р2, ..., рn того же типа,  что и компоненты переменной FV;

n – целочисленное выражение.

Процедуры

Процедуры осуществляют все необходимые действия по организации файлов и доступу к компонентам файлов.

  1.  Append(FV) – открыть файл и установить указатель на маркер конца файла. Используется только для добавления новых компонентов в текстовые файлы.
  2.  AssignFile(FV,Str) – присвоить имя файлу. Имя файла, которое является значением Str, присваивается переменной файлового типа FV. С момента выполнения этой процедуры все действия над этой переменной будут эквивалентны действиям над файлом, определяемым значением Str.
  3.  Rewrite(FV) – создать новый файл. Эта процедура служит для создания нового файла на носителе. Имя файла было предварительно определено в процедуре Assign. Если на носителе уже был файл с таким именем, он уничтожается. Указатель файла устанавливается в первую позицию (с номером 0). Фактически файл не содержит ни одного компонента, он только подготовлен для загрузки.
  4.  Reset(FV) – установить указатель в начало файла. Выполнение процедуры обеспечивает установку указателя файла на первый компонент. Если эта процедура применена к несуществующему файлу, возникает ошибка ввода-вывода.
  5.  Read(FV,P) – читать из файла. Производится чтение из файла, определенного файловой переменной FV, значений p1, р2, ..., рn. После завершения выполнения процедуры указатель перемещается на следующий компонент.
  6.  Read(FV,Ch) – считывание символа в Ch из текстового файла FV.
  7.  Readln(FV,Str) – чтение из текстового файла FV строки Str.
  8.  Write(FV,P) – записать в файл. Переменные p1, р2, ..., рn записываются в файл, определенный переменной FV. После выполнения процедуры указатель перемещается к следующему компоненту.
  9.  Write(FV,Ch) – занесение символьной переменной Ch в файл FV.
  10.  Writeln (FV,Str) – запись в тектовый файл FV строки Str.
  11.  Seek(FV,n) – установить указатель на компонент с порядковым номером n в файле. Указатель перемещается к компоненту с номером n, начиная счет с нуля, т.е. первый компонент имеет номер 0, второй – 1, третий – 2 и т.д.
  12.  Flush(FV) – очистить буфер сектора. Выполнение процедуры вызывает выталкивание внутреннего буфера в файл, если ранее выполнялись операции записи. Фактически происходит очистка буфера только текстового файла. К закрытому файлу процедура Flush не применяется.
  13.  CloseFile(FV) – закрыть файл. Выполнение процедуры обеспечивает закрытие файла, назначенного переменной FV. Если файл был открыт, никогда не следует выходить из программы, предварительно не закрыв его.
  14.  Erase(FV) – уничтожить файл. Выполнение процедуры вызывает уничтожение файла, назначенного переменной FV. Если производится уничтожение открытого файла, его необходимо предварительно закрыть с помощью процедуры Close.
  15.  Rename(FV,Str) – переименовать файл. Выполнение процедуры вызывает занесение в каталог диска (директорий) нового имени файла.
  16.  Truncate(FV) – уничтожить все компоненты файла, начиная с места текущего положения указателя, и подготовить файл для записи.

Функции

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

  1.  Eof(FV) – проверить маркер «конец файла». Значение функции равно True, если указатель файла находится сразу за последним компонентом файла, и False в любом другом случае.
  2.  Eoln(FV) – функция возвращает булевское значение True, если указатель файла достиг маркера конца строки. В противном случае возвращает значение False.
  3.  SeekEoln(FV) – функция, аналогичная предыдущей, но указатель файла переходит все пробелы и знаки табуляции. Возвращает значение True при достижении маркера конца строки.
  4.  FilePos(FV) – определить текущий номер компонента. Функция возвращает целочисленное значение, равное номеру компонента, на котором установлен в данный момент указатель файла, соответствующего переменной FV. Отсчет номера компонента начинается с нуля.
  5.  FileSize(FV) – определить длину файла. Функция возвращает целочисленное значение, равное количеству компонентов файла, соответствующего переменной FV. Эта функция обычно используется для проверки, содержит файл какую-либо информацию или является пустым. Если FileSize(FV) = 0, то файл пуст, в другом случае файл содержит данные. Размер файла берется из директория.
  6.  IOResult(FV) – проверить результат выполнения последней операции ввода-вывода на наличие ошибок. Если ошибка обнаружена, функция возвращает номер ошибки, если ошибок нет, возвращает значение 0.


 

А также другие работы, которые могут Вас заинтересовать

35800. Творчий проект на тему: “Вишивка у інтер’єрі” 371 KB
  Обґрунтування виробу кращої ідеї для реалізації проекту на основі проведених досліджень. Створення клаузори виробу. Визначення отриманої технології виготовленого виробу. Складання технологічної картки виготовлення виробу.
35801. Виготовлення сумки. Творчий проект 1.94 MB
  Виходячи з призначення проектованого виробу та його особливостей сумка повинна мати естетичний вигляд матеріали повинні бути екологічно чисті та нешкідливі як для дорослих та і для дітей.3 Вимоги до конструкції виробу Речі з яких виготовляється сумка повинні забезпечувати безпечність при користуванні.3 Підбір та аналіз матеріалів для виготовлення виробу.
35802. Виготовлення підсвічника. Творчий проект 269.5 KB
  Види будова і властивості деревини Деревина це матеріал одержуваний зі зрубаного і очищеного від кори й галузей стовбура дерева. Навесні клітки дерева менш щільні й міцні рання деревина чим улітку й восени пізня деревина; крім того перші більше світлого кольору. Спелодревесние: ялина ялиця червоний бук липа; у цих дерев деревина не ділиться на ядро і заболонь але внутрішні шари більш міцні і стиглі як і у ядерна порода. Чим більше щільність тим деревина міцніше важче і твердіше але тим складніше її обробка.
35803. Творчий проект на виготовлення декоративної шкатулки 324.5 KB
  Під час вивчення народних традицій та народних промислів виникла думка про виготовлення шкатулки. Естетичний вигляд шкатулки підкреслить будьякий інтер'єр. Запропоновано три варіанта декоративної шкатулки різних конфігурацій та різними способами їх оздоблення.
35807. Виготовлення візитниці. Творчий проект 23.86 MB
  На мою думку підготовка проекту з трудового навчання дає нам можливість опанувати технології обробки сучасних конструкційних матеріалів щоб надати виробу естетичної привабливості. 2 Зробити розрахунки розмірів виробу. 4 Розробити технологічну карту виготовлення виробу. Вимоги до виробу Канцелярський набір візитниця повинен відповідати таким вимогам: Ергономіки зручність у використанні; Естетики задоволення смаку будьякого споживача; Технології конструкція не повинна бути занадто складною ...