Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторный практикум по информатике

.pdf
Скачиваний:
253
Добавлен:
18.03.2015
Размер:
8.86 Mб
Скачать

12. Существуют ли ограничения на тип возвращаемого функцией значения?

8. Требования к содержанию и оформлению отчета

Отчет о проделанной работе должен содержать: название и цель работы; номер и условие своего варианта;

описание основных этапов задания; тексты разработанных программ;

полученные при расчетах результаты (скриншоты); анализ полученных результатов и вывод по проделанной работе;

ответы на контрольные вопросы в соответствии с указаниями преподавателя.

9. Критерии результативности лабораторного практикума

Лабораторная работа считается выполненной, если: задание к лабораторной работе выполнено в полном объеме;

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

при устном ответе на 2-3 контрольных вопроса по указанию преподавателя студент демонстрирует знание основных операторов и определений изученной темы и умение применить их при решении соответствующих задач; представленный отчет по лабораторной работе соответствует требованиям раздела 8.

Лабораторная работа №6

ФАЙЛЫ И ИХ ПРИМЕНЕНИЕ В PASCAL-ПРОГРАММАХ

1. Цель работы

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

2. Задачи работы

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

3. Теоретическая часть 3.1. Основные понятия и определения

Файл – именованная область памяти на устройстве хранения информации.

Файловая переменная – внутренняя структура данных Паскаля, используемая для всех операций с файлами.

Связывание файловой переменной – установка соответствия между файловой переменной и файлом на диске. Требуется для любых операций с файлом.

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

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

Признак конца файла – состояние, при котором указатель файла находится за последним элементом файла.

Признак конца строки – состояние, при котором указатель файла находится перед символами конца строки в текстовом файле.

Блочная операция чтения/записи — операция чтения/записи,

при выполнении которой считывается/записывается несколько элементов данных.

3.2. Теоретические сведения

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

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

В Паскале выделяют три типа файлов: текстовые, типизированные, нетипизированные.

Текстовый файл – содержит строки текста различной длины, чтение или запись осуществляется (как правило) построчно.

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

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

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

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

файл указатель файла

Рис. 1. Принцип организации указателя

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

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

file of <тип> - типизированный файл (указан тип компоненты);

text — текстовый файл;

file — нетипизированный файл. Примеры описания файловых переменных:

var

f1: file of integer; {файл с целыми числами}

f3: file;

{нетипизированный файл}

t: text;

{текстовый файл}

3.2.1. Стандартные процедуры и функции. Любые дисковые файлы становятся доступными программе после связывания их с файловой переменной, объявленной в программе. Все операции в программе производятся только с помощью связанной с ним файловой переменной.

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

Assign(f, FileName);

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

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

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

Процедура Close(f) закрывает открытый до этого файл с файловой переменной f. Вызов процедуры Close необходим при завершении работы с файлом. Если по какой-то причине процедура Close не будет выполнена, файл все-таки будет создан на внешнем

устройстве, но содержимое последнего буфера в него не будет перенесено.

Процедура EOF(f) возвращает значение TRUE, когда при чтении достигнут конец файла. Это означает, что уже прочитан последний элемент в файле или файл после открытия оказался пуст.

Процедура Rename(f, NewName) позволяет переименовать физический файл на диске, связанный с файловой переменной f. Переименование возможно после закрытия файла.

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

3.2.2. Текстовые файлы. Текстовый файл - это совокупность строк, разделенных метками конца строки. Сам файл заканчивается меткой конца файла. Доступ к каждой строке возможен лишь последовательно, начиная с первой. Одновременная запись и чтение запрещены.

Текстовый файл содержит строки текста различной длины. Каждая строка завершается символами «Возврат каретки» (код 13) и «Перевод строки» (код 10). При обычном просмотре эти символы на экране не отображаются, а интерпретируются компьютером как признак окончания одной строки и начала следующей.

Текстовый файл не эквивалентен объявлению типизированного файла с элементами типа «строка».

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

Var

FT: Text;

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

Assign(FT,‘log.txt‘);

При работе с текстовым файлом разрешается либо чтение, либо запись. Открытие файла для чтения или записи выполняется процедурами ReSet или ReWrite. Для текстовых файлов, помимо процедур ReSet/ReWrite, определена еще одна процедура открытия:

Append(F);

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

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

Read(FT, i,j), ReadLn(FT, s),

либо записывать в него данные, применяя операторы

Write(FT, a,b,c), WriteLn(FT, Result).

При чтении/записи данных применяются те же правила, что и при вводе/выводе с клавиатуры/на экран, т.е. можно использовать форматирование:

WriteLn(F, x:5:2, y:10:3).

Процедуры считывают информацию из файла f и записывают соответственно в указанные переменные. Способ чтения зависит от типа переменных, стоящих в списке. В переменную char помещаются символы из файла. В числовую переменную: пропускаются символыразделители, начальные пробелы и считывается значение числа до появления следующего разделителя. В переменную типа string помещается количество символов, равное длине строки, но только в том случае, если раньше не встретились символы конца строки или конца файла. Отличие опрератора ReadLn от Read в том, что в случае применения оператора ReadLn после прочтения данных пропускаются все оставшиеся символы в данной строке, включая метку конца строки. Если список переменных отсутствует, то процедура ReadLn(f) пропускает строку при чтении текстового файла.

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

Assign

ReSet

ReWrite

Append

Read / ReadLn

Write / WriteLn

Close

Рис. 2. Последовательность вызываемых процедур для текстовых файлов

3.2.3. Типизированные файлы. Типизированный файл — это последовательность компонент любого заданного типа (кроме типа

«файл»). Доступ к компонентам файла осуществляется по их порядковым номерам. Компоненты нумеруются, начиная с 0. После открытия файла указатель (номер текущей компоненты) стоит в его начале на нулевом компоненте. После каждого чтения или записи указатель сдвигается к следующему компоненту.

Типизированный файл, содержит компоненты одного конкретного типа. Это могут быть простые или сложные типы данных Паскаля (числа, строки, символы, массивы, записи и т.д.). Объявление типизированного файла выглядит следующим образом:

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

 

 

Assign(F,‘data.dat‘);

{ связать F с файлом на диске}

ReSet(F);

{ открыть файл }

While not EOF(F) do begin { пока не конец файла}

Read(F,N);

{ считать число из файла }

WriteLn(N);

{ вывести число на экран }

End;

 

 

Close(F);

{ закрыть файл }

End.

В данном примере показана типовая последовательность действий при работе с файлами. Цепочка вызовов «Assign – ReSet/ReWrite – Read/Write – Close» должна присутствовать в любой программе, использующей типизированные файлы.

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

 

 

 

Assign

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ReSet

 

 

ReWrite

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Read/Write

 

 

 

Write

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Close

Рис. 3. Последовательность вызываемых процедур для типизированных файлов

При любой операции чтения/записи указатель текущей позиции смещается на одну единицу.

Для определения текущей позиции указателя применяется функция 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);

Эта функция возвращает целое число, равное количеству компонент в указанном файле.

Отсечение последних компонент файла:

Truncate(f);

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

3.2.4. Нетипизированные файлы. Нетипизированные файлы очень похожи на типизированные, за исключением того, что при работе с ними можно сразу считать или записать несколько элементов файла.

Нетипизированные файлы — это последовательность компонент произвольного типа.

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

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);

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

онеполном чтении.

Аналогичные правила действуют для записи данных в файл:

BlockRead(F, Biffer, Count); BlockRead(F, Biffer, Count, Result);

Частичная запись возможна в том случае, если на диске заканчивается свободное место.

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

3.2.5. Сводная таблица процедур и функций для работы с файлами.

Таблица 1. Сводная таблица процедур и функций, используемых в работе с файлами

Проц/функ

Типизированный

Нетипизированный

Текстовый

Assign

+

+

+

Rewrite

+

+

+

Reset

+

+

+

Append

 

 

+