Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вопросы к курсу программирования.doc
Скачиваний:
4
Добавлен:
09.09.2019
Размер:
878.08 Кб
Скачать

26. Типы данных в Паскале: структурированные типы. Файлы (понятие файла, доступ к файлу, процедуры и функции для работы с файлами).

Тип-файл представляет собой последовательность компонент одного типа, записанную во внешней памяти под определенным именем. Целесообразность применения файлов диктуется следующими причинами. 1. Ввод больших объемов данных, подлежащих обработке, утомителен и требуeт большого времени. Гораздо удобнее создать отдельный файл данных, который может быть подготовлен заранее и, самое главное, применяться неоднократно. 2. Файл данных может быть подготовлен другой программой, становясь, таким образом, связующим звеном между двумя разными задачами, а также средством связи программы с внешней средой. 3. Программа, использующая данные из файла, не требует присутствия пользователя в момент фактического исполнения. Компоненты файла могут иметь любой тип, за исключением типа-файла и типа-объекта. Число компонент в файле не объявляется и может быть произвольным.  Файловый тип или переменную файлового типа можно задать одним из трех способов: 

<имя> = FILE OF <тип>; {Описание типизированного файла} <имя> = TEXT; {Описание текстового файла} <имя> = FILE; {Описание нетипизированного файла}

Здесь <имя> - имя файлового типа (правильный идентификатор); FILE, OF - зарезервированные слова (файл, из); TEXT - имя стандартного типа текстовых файлов; <тип> - любой тип Турбо Паскаля, кроме файлов.  Стандартный тип Text определяет тип-файл, содержащий символы, объединенные в строки. Однако, тип Text в ТР не эквивалентен типу File of Char.  Для доступа к файлу описывается специальная файловая переменная (чаще всего ее обозначают как F). 

Var : file of <имя типа>;

Например:

Type product = record  name : String;  code : Word;  cost : integer;  end;  text80 = file of String [80] ;  var  fl : file of char; {Типизированный файл} f2 : text; {Текстовый файл} f3 : file; {Нетипизированный файл} f4 : text80; {Типизированные } f5 : file of product; { файлы }

В данном примере F1, F4 и F5- типизированные файлы, F2 - текстовый файл, F3 -нетипизированный файл. Над файловыми переменными нельзя выполнять никаких операций (присваивать значение, сравнивать и т. д.). Их можно использовать только для выполнения операций с файлами (чтение, запись, удаление файла и др.).

27. Типы данных в Паскале: структурированные типы. Файлы (текстовые, типизированные, нетипизированые).

Те́кстовый файл — компьютерный файл, содержащий текстовые данные, как правило, организованные в виде строк.

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

В отличие от термина «текстовый формат», характеризующего содержимое данных, термин «текстовый файл» относится к самому файлу как контейнеру, хранящему такие данные.

Текстовый файл представляет из себя последовательность символов и знаков препинания (принадлежащих тому или иному набору символов). Это символы обычно сгруппированы в строки (англ. lines, rows) (в современных системах строки разделяются разделителями строк, хотя в прошлом применялось хранение строк в виде записей постоянной или переменной длины). Иногда конец текстового файла (особенно если в файловой системе не хранится информация о размере файла) также отмечается одним или более специальными знаками, известными как маркеры конца файла.

Текстовой файл может содержать как форматированный, так и неформатированный текст.

Типизированный файл – это файл, в котором содержатся однотипные данные. Типизированный файл задается с помощью 2-х ключевых слов «file of». После слова «of» указывается тип файла, например integer, real, char, string и т.д. Тип файла может быть любым за исключением файлового типа (не может быть файла файлов) и комбинированного типа, один из компонентов которого имеет файловый тип.

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

Напишем программу, которая создаст своеобразную базу данных, хранящей сведения о студентах: их именах, номерах курса и групп.

Типизированные файлы в Паскаль.

  1. Program file11;

  2. uses crt;

  3. Type Student = record

  4.       fio: string [20];

  5.       kurs, group: integer;

  6. end;

  7. var zap : student;

  8.      f: file of student;

  9.      name: string;

  10. begin

  11. clrscr;

  12. Writeln ('Задайте имя файла');

  13. Readln (name);

  14. Assign (f, name);

  15. Rewrite (f);

  16. Writeln ('Введите фамилию и инициалы студента');

  17. Readln (zap.fio);

  18. While zap.fio <> ' ' do

  19. Begin

  20. Writeln ('Введите номер курса и группы');

  21. Readln (zap.kurs, zap.group);

  22. Write (f, zap);

  23. Writeln ('Введите фамилию и инициалы следующего студента ');

  24. Readln (zap.fio);

  25. End;

  26. Close(f);

  27. Writeln ('Файл создан');

  28. readln

  29. End.

Строки №3-№6. Объявляем в программе тип Record и указываем для него компоненты. Первый компонент «fio» (строка №4) будет описывать фамилию и инициалы студента. Компоненты «kurs» и «group» будут описывать соответственно номер курса и номер группы.

Строка №7. Объявляем переменную «zap» и указываем для нее тип «Student». Теперь с помощью переменной «zap» мы можем обратиться к любому компоненту записи.

Строка №8. Создаем файловую переменную «f» и указываем для нее тип «Student». Таким образом, мы создаем файл записей, где будет храниться информация о студентах.

В строке №9 создаем переменную «name», которая понадобится нам для создания имени файла.

Строка №13. Вводим с клавиатуры имя файла. Это имя будет записано в переменную «name».

Строка №14. Связываем файловую переменную «f» с именем файла. Как и в случае с текстовыми файлами связывание файловой переменной с файлом производится с помощью процедуры Assign

Строка №15. Открываем файл для записи. Открытие типизированного файла для записи производится аналогично текстовым файлам с помощью процедуры Rewrite. Так как самого файла не существует, он будет создан автоматически и будет иметь имя, которое мы задали в строке №13.

Строка №17. После вывода на экран сообщения (строка №16) мы вводим значение для 1-ого компонента записи (фамилию и инициалы студента).

Строка №18. Записываем цикл. До тех пор пока не будет введено пустое значение для компонента «zap.fio» необходимо выполнять действия, записанные в строках №20 - №24. Знак <> означает неравно. После этого знака в апострофах записывается значение, которому не должен быть равен компонент «zap.fio». Внутри апострофов мы ставим знак пробела. Таким образом, цикл будет выполняться до тех пор, пока вместо фамилии очередного студента не будет нажата клавиша «пробел».

В цикле будут выполняться поочередно 4 действия:

  • Строка №20. Выводим на экран сообщение.

  • Строка №21. Вводим с клавиатуры через пробел номер курса и номер группы.

  • Строка №22. В файловую переменную «f» заносим содержимое записи «zap».

  • Строка №23. Выводим на экран сообщение.

  • Строка №24. Вводим с клавиатуры фамилию и имя студента.

Эти строки будут повторяться в цикле, пока на предложение ввести фамилию и инициалы студента мы просто нажмем пробел. После этого файл будет закрыт (строка №26) и на экран будет выведено сообщение (строка №27).

После запуска программы нам необходимо ввести имя файла. Я ввел имя «programs\students.dat». Автоматически в директории «C:\FPC\2.2.2\bin\i386-win32\Programs» создается файл с таким именем. После этого необходимо ввести фамилии студентов и номера курсов и групп. Я ввел данные для двух студентов Путина и Медведева. На очередное сообщение ввести фамилию студента я нажал пробел.

Нетипизированные файлы объявляются как файловые переменные типа FILE и отличаются тем, что для них не указан тип компонентов. Отсутствие типа делает эти файлы, с одной стороны, совместимыми с любыми другими файлами, а с другой -позволяет организовать высокоскоростной обмен данными между диском и памятью.  При инициации нетипизированного файла процедурами RESET или REWRITE можно указать длину записи нетипизированного файла в байтах. Например, так: 

var  f: file;  begin  .......  assign(f, 'myfile.dat')  reset(f,512);  .......  end. 

Длина записи нетипизированного файла указывается вторым параметром при обращении к процедурам RESET или REWRITE, в качестве которого может использоваться выражение типа WORD. Если длина записи не указана, она принимается равной 128 байтам.  Турбо Паскаль не накладывает каких-либо ограничений на длину записи нетипизированного файла, за исключением требования положительности и ограничения максимальной длины 65535 байтами (ёмкость целого типа WORD). Однако для обеспечения максимальной скорости обмена данными следует задавать длину, которая была бы кратна длине физического сектора дискового носителя информации (512байт). Более того, фактически пространство на диске выделяется любому файлу порциями - кластерами, которые в зависимости от типа диска могут занимать 2 и более смежных секторов. Как правило, кластер может быть прочитан или записан за один оборот диска, поэтому наивысшую скорость обмена данными можно получить, если указать длину записи, равную длине кластера.  При работе с нетипизированными файлами могут применяться все процедуры и функции, доступные типизированным файлам, за исключением READ и WRITE, которые заменяются соответственно высокоскоростными процедурами BLOCKREAD и BLOCKWRITE . Для вызова этих процедур используются следующие предложения: 

BLOCKREAD (<ф .п . >, <буф>, < [, ] )  BLOCKWRITE (<ф . п . >, <буф>, < [, ] ) 

Здесь <буф> - буфер: имя переменной, которая будет участвовать в обмене данными с дисками;  - количество записей, которые должны быть прочитаны или записаны  за одно обращение к диску;  - необязательный параметр, содержащий при выходе из процедуры  количество фактически обработанных записей.  За одно обращение к процедурам может быть передано до N*RECS байт, где RECS - длина записи нетипизированного файла. Передача идет, начиная с первого байта переменной <буф>. Программист должен позаботиться о том, чтобы длина внутреннего представления переменной <буф> была достаточной для размещения всех N*RECS байт при чтении информации с диска. Если при чтении указана переменная <буф> недостаточной длины или если в процессе записи на диск не окажется нужного свободного пространства, возникнет ошибка ввода-вывода, которую можно заблокировать, указав необязательный параметр (переменная типа WORD).  После завершения процедуры указатель смещается на записей. Процедурами SEEKFILEPOS и FILESIZE можно обеспечить доступ к любой записи нетипизированного файла.