
- •Цель работы
- •Основные понятия и определения
- •Теоретические сведения
- •Типизированные файлы
- •Нетипизированные файлы
- •Текстовые файлы
- •Сводная таблица процедур и функций для работы с файлами
- •Примеры решения задач с использованием файлов
- •Типизированный файл
- •Текстовый файл
- •Задание
- •Программа
- •Задания
- •Контрольные вопросы
Министерство образования Российской Федерации
Уфимский государственный авиационный технический университет Кафедра экономической информатики
ФАЙЛЫ
ИИХ ПРИМЕНЕНИЕ
ВPASCAL-ПРОГРАММАХ
МЕТОДИЧЕСКИЕ УКАЗАНИЯ по курсу «Информатика»
УФА 2004
Составитель: Д.Н.Бажин
ББК
УДК
Файлы и их применение в Pascal-программах. Методическое пособие по курсу «Информатика» /Уфимск.гос.авиац.техн.ун-т; Сост.: Д.Н.Бажин. – Уфа: УГАТУ, 2004. –14с.
В методических указаниях излагается материал для освоения и приобретения навыков написания программ на языке программирования Pascal с использованием типизированных, нетипизированных и текстовых файлов. Рассматриваются основные понятия, способы работы с файлами и даны примеры основных алгоритмов решения задач с использованием файлов.
Предназначены для студентов очной формы обучения дипломированных специалистов любых специальностей.
Ил. 5. Табл. 1.
Содержание
Цель работы
Ознакомление с разновидностями файлов в Паскале. Принципы организации и порядок работы с типизированными файлами. Принципы организации и порядок работы с нетипизированными файлами. Организация текстовых файлов, операции чтения и записи текстовых файлов.
Основные понятия и определения
Файл – именованная область памяти на устройстве хранения информации.
Файловая переменная – внутренняя структура данных Паскаля, используемая для всех операций с файлами.
Связывание файловой переменной – установка соответствия между файловой переменной и файлом на диске. Требуется для любых операций с файлом.
Указатель файла – маркер, показывающий, с какой позиции будет производиться чтение/запись в файле.
Признак начала файла – состояние, при котором указатель файла находится перед первым элементом файла.
Признак конца файла – состояние, при котором указатель файла находится за последним элементом файла.
Признак конца строки – состояние, при котором указатель файла находится перед символами конца строки в текстовом файле.
Блочная операция чтения/записи – операция чтения/записи при выполнении которой считывается/записывается несколько элементов данных.
Теоретические сведения
Как правило, пользователь работает с компьютером не один раз. Зачастую информация, с которой работает пользователь, требуется многократно в течение длительного времени. Держать эту информацию постоянно в оперативной памяти нерационально. Для долговременного хранения информации ее требуется организовать.
Для долгосрочного хранения информации применяются файлы. Файл – это именованная область памяти на долгосрочном запоминающем устройстве, например, на жестком диске или дискете. Язык Паскаль предлагает несколько способов для работы с файлами.
В Паскале выделяют три типа файлов: текстовые, типизированные, нетипизированные.
Текстовый файл – содержит строки текста различной длины, чтение или запись осуществляется (как правило) построчно.
Типизированный файл – с точки зрения Паскаля содержит элементы одного типа, единицей обмена информацией является один элемент. Т.е. за

одну операцию чтения или записи можно прочитать или записать только один элемент файла.
Нетипизированный файл – содержит любые данные, Паскалем никак не интерпретируемые. Позволяет производить за одну операцию чтение/запись сразу нескольких элементов.
Для файлов с произвольным доступом есть понятие файлового указателя. Принцип организации указателя приведен на рисунке:
компоненты файла
файл указатель файла
Фактически указатель располагается между компонентами файла. В общем случае можно говорить о том, что указатель находится перед компонентой, которая будет считана или записана следующей операцией чтения/записи.
Типизированные файлы
Это файл, содержащий компоненты одного конкретного типа. Это могут быть простые или сложные типы данных Паскаля (числа, строки, символы, массивы, записи и т.д.).
Объявление типизированного файла выглядит следующим образом:
Type
FInt = file of Integer; { файл с целыми числами }
Var
F: FInt;
F2: File of Real;
FT: File of String[70]; { файл со строками }
Внимание! Файл в Паскале не равнозначен файлу в операционной системе! Более корректно говорить о файловой переменной в Паскале
После объявления файловой переменной для работы с файлом необходимо связать ее с реальным файлом на диске. Это выполняется процедурой Assign:
Assign(F,’c:\test\testfile.dat’);
Первый параметр – имя файловой переменной, используемой в дальнейшем для обращения к файлу. Может иметь любой файловый тип. Второй параметр – строка, указывающая на путь и имя файла, с которым Паскаль далее будет оперировать. Имя файла рекомендуется задавать по правилам MS-DOS (не более 8 символов имя, не более 3 – расширение, англ. буквы).
Если файл будет считываться, он должен присутствовать на диске. Если создается новый файл, он может отсутствовать. Процедура Assign не проверяет наличие файла на диске!

Для создания нового файла на диске после выполнения процедуры Assign необходимо открыть файл в режиме записи:
ReWrite(F);
где F – это файловая переменная.
Если файл с таким именем не существовал, он создается. Если он существовал, вся информация из этого файла стирается и файл становится пустой. При этом никаких предупреждений не выдается!
Для открытия файла в режиме чтения он должен быть открыть процедурой:
Reset(F);
После этого можно выполнять чтение или запись, используя соответствующую файловую переменную:
Read(F,i,j);
Write(F,n);
В первом примере из файла, связанного с переменной F, считывается два значения, во втором - записывается одно.
Эти операции можно выполнять многократно. Например, можно считать из открытого файла все значения и вывести их на экран:
Var |
{ объявление |
файловой переменной } |
|
F: file of Integer; |
|||
N: Integer; |
|
|
|
Begin |
{ |
связать |
F с файлом на диске} |
Assign(F,’data.dat’); |
|||
ReSet(F); |
{ |
открыть |
файл } |
While not EOF(F) do begin { |
пока не |
конец файла} |
|
Read(F,N); |
{ |
считать |
число из файла } |
WriteLn(N); |
{ |
вывести |
число на экран } |
End; |
{ |
закрыть |
файл } |
Close(F); |
|||
End. |
|
|
|
В данном примере показана типовая последовательность действий при работе с файлами. Цепочка вызовов «Assign – ReSet/ReWrite – Read/Write – Close» должна присутствовать в любой программе, использующей типизированные файлы.
Последовательность вызываемых процедур при работе с типизированными файлами представлена на рисунке:
|
|
|
Assign |
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
ReSet |
|
|
ReWrite |
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Read/Write |
|
|
|
Write |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
Close |
|
|
||
|
|
|
|
|
|
|
|
При любой операции чтения/записи указатель текущей позиции смещается на одну единицу.
Для определения текущей позиции указателя применяется функция
FilePos:
N := FilePos(F);
Эта функция возвращает положение указателя относительно начала файла. Самая первая позиция имеет номер 0. Переместить указатель в требуемую позицию можно, используя функцию Seek:
Seek(F,5); Seek(F,FilePos(F)-1);
Первый оператор устанавливает позицию указателя в файле после 5 элемента (и перед 6-м). Следующий оператор вызывает смещение указателя файла на 1 элемент назад относительно текущего положения указателя.
Дополнительно для проверки положения указателя есть функция EOF. Эта функция возвращает логическое значение, показывающее, находится ли указатель файла после последнего элемента файла. Чаще всего эта функция применяется в задачах полного перебора элементов файла:
While not EOF(F) do Read(F,i);
Этот оператор считывает элементы файла, пока не доберется до конца файла.
Общее число компонент файла можно определить, вызвав функцию
FileSize:
Count := FileSize(F);
Эта функция возвращает целое число, равное количеству компонент в указанном файле.
Нетипизированные файлы
Нетипизированные файлы очень похожи на типизированные, за исключением того, что при работе с ними можно сразу считать или записать несколько элементов файла.
Объявление нетипизированного файла:
Var
F: File;
Открытие нетипизированного файла выполняется процедурами ReSet или ReWrite. При этом может указываться дополнительный параметр, который указывает размер одного блока данных в байтах:
ReSet(F, 25);
или
ReWrite(F, SizeOf(Integer)*12);
В первом примере открывается файл для чтения/записи с размером блока 25 байт. Во втором случае размер блока указывается через размер типа Integer. Функция SizeOf возвращает кол-во байт, отводимых под указанный тип или переменную. Если размер блока данных опущен, принимается размер по умолчанию, равный 128 байт.
Чтение данных выполняется следующей процедурой:
BlockRead(F, Biffer, Count); BlockRead(F, Biffer, Count, Result);