Файл: Методичка к лабораторным и практическим.doc

ВУЗ: Не указан

Категория: Методичка

Дисциплина: Программирование

Добавлен: 15.11.2018

Просмотров: 5178

Скачиваний: 36

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Над значениями файлового типа не определены какие-либо операции. Все операции могут производиться лишь с элементами (компонентами) файлов. Множество операций над компонентами файла определяется типом компонент.

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

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

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

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

2) для внешнего файла связать эту переменную с конкретным физическим файлом;

3) инициировать файл.

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

Описание типизированных файлов имеет следующий вид:

Type

<имя типа> = File of <базовый тип>;

Var

<имя файловой переменной> : <имя типа>;

или

Var

<имя файловой переменной> : File of <базовый тип>;

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

Пример:

Type

Digit = File of Byte;

Mas = Array [1..20] of Real;

Zap = Record

X, Y : Integer

End;

Var

F1 : Digit; {Каждый элемент файла – целое число от 0 до 255}

F2 : File of Real; {Каждый элемент файла – вещественное число}

F3 : File of String; {Каждый элемент файла – строка}

F4 : File of Mas; {Каждый элемент файла – массив}

F5 : File of Zap; {Каждый элемент файла – запись}

Особым типом файлов являются текстовые файлы, которые состоят из символов, объединенных в строки. Для описания текстовых файлов в Турбо Паскаль введен стандартный тип TEXT.


Пример:

Var

F6 : Text;

После того, как файловая переменная определена, в программе ее нужно связать с конкретным физическим файлом. Для этой цели используется стандартная процедура Assign(F, Name). Она связывает файловую переменную F с внешним файлом, имеющим имя Name. Name – это переменная или константа типа String. Имя файла должно быть написано в соответствии с правилами MS DOS.

Пример:

Const

Name = ‘a:\dir\subdir\out.txt’;

Var

Finp : Text;

Fout : File of Real;

Begin

. . . . . . . .

Assign(Finp, ‘D : STR . TXT’);

Assign(Fout, Name);

. . . . . . . .

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

Стандартная процедура Reset(F) открывает существующий файл, с которым связана файловая переменная F, и устанавливает указатель файла на первый элемент файла, т.е. на элемент с номером 0.


Стандартная процедура Rewrite(F) открывает новый пустой файл для записи, и ему присваивается имя, заданное процедурой Assign. Если файл с таким именем уже существует, то он уничтожается и никаких сообщений в программу не передается. Файл подготавливается к приему информации, а его указатель устанавливается на первый элемент файла.

Далее кратко описаны некоторые стандартные процедуры и функции, которые используются при работе с файлами. Во всех этих процедурах и функциях F – файловая переменная, связанная с конкретным физическим файлом процедурой Assign.


Процедуры и функции, которые применимы для всех категорий файлов


Процедуры

Read(F, Х1,Х2,...,ХN) — считывает в переменную X1 один элемент файла F (или несколько элементов в переменные X1, ..., ХN), начиная чтение с элемента, на котором установлен указатель.

Write( F, Xl, X2, ...,XN) — записывает одно (X1) или более (X1,.... ХN) значений переменных в файл F, начиная с той позиции, на которую установлен указатель.

Close(F) — закрывает файл F.

Erase(F) — удаляет внешний файл, связанный с файло­вой переменной F.

Rename(F, NewName) — присваивает внешнему файлу, связанному с файловой переменной F, новое имя NewName.

Функции.

Eof(F) – конец файла - принимает значение True, если указатель находится за последней компонентой файла, и False - противном случае.

IOResult – возвращает условный признак последней операции ввода-вывода. Если операция завершилась успешно, функция возвращает ноль. В противном случае она возвращает код ошибки ввода-вывода. Следует помнить, что функция IOResult становится доступной при отключенном автоконтроле ошибок ввода-вывода. Директива компилятора {$I-} отключает, а директива {$I+} включает автоконтроль.


Процедуры и функции для типизированных файлов


Процедуры

Seek(F, N) – смещает указатель файла к компоненту с номером N. При этом первый компонент файла имеет номер N = 0, второй – N = 1 и т.д.

Truncate(F) – удаляет часть файла, начиная с текущего компонента и до конца файла.

Функции.

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

FiIeSize( F) – возвращает значение, которое содержит размер (число компонент) файла.


3.2. Работа с файлами


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

- файл должен быть открыт для работы с ним;

- файл должен быть создан и записан на внешний но­ситель (запись файла);

- файл может быть считан с внешнего носителя в опе­ративную память (чтение файла) и обработан;

- обработанный файл может быть снова записан на внешний носитель;

  • файл должен быть закрыт по окончании работы с ним.


Рассмотрим пять основных операций с внешними файлами:

1) запись в файл;

2) чтение файла;

3) добавление данных к файлу;

4) запись и чтение файла;

5) прямая выборка элементов файла.


Запись в файл


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


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

1) описать файловую переменную;

2) связать ее с выходным файлом (Assign);

3) открыть файл для записи (Rewrite);

4) вывести данные из программы в файл (Write);

5) закрыть файл для записи (Close);

Общая форма записи в файл имеет следующий вид:

Rewrite(F);

. . . . . . . . . .

Write(F,Al,A2,...,An);

. . . . . . . . . .

Close(F);

Здесь F — имя файла; Al, A2, ..., An — выражения (в том чис­ле константы и переменные) того же типа, что и элементы файла.

Процедура Rewrite осуществляет подготовку к записи информации в файл F (очищает файл и устанавливает указатель в начало файла). Оператор Write записывает значения выражений Al, A2, .... An по одному в конец файла F (после имеющейся в нем информации).

Пример 3.1. Создать файл данных с именем D:\APPDOS\FP1.DAT, содержащий фамилии студентов и год их рождения.

Решение.

Возможный вариант программы:

Program Prim31;

Type

Stud = Record

Fio : String;

Year : Integer;

End;

Var

F : File of Stud;

St : Stud;

C : Char;

Begin

Assign(F, 'D:\APPDOS\FP1.DAT');

Rewrite(F);

C:='Д';

While (C='Д') OR (C ='д') Do

Begin

{Ввод с клавиатуры двух полей записи}

Write('Введите фамилию ');

Readln(St.Fio);

Write('Введите год ');

Readln(St.Year);

{Запись в файл. Элементом файла является вся запись}

Write(F, St);

Writeln('Продолжим ввод?(д/н)');

Readln(C);

End;

Close(F);

End.



Чтение файла


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

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

1) описать файловую переменную;

2) связать ее с внешним файлом (Assign);

3) открыть файл для чтения (Reset);

4) ввести данные файла в программу (Read);

5) закрыть файл для чтения (Close).

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

Reset(F);

. . . . . . . .

Read(F,Xl.X2,...,XN);

. . . . . . . .

Close(F);

Тип переменных X1, Х2, ..., XN должен соответствовать базовому типу элементов файла (это условие необязательно для текстовых файлов ).

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

Оператор Read последовательно присваивает переменным X1, Х2, ..., XN значения из файла F. Количество этих переменных не должно превышать количества данных, которые могут быть введены из файла. В противном случае выполнение программы прекращается. Вместо Read (F,X1,X2,... ,ХN) можно использовать несколько операторов Read:

Read(F, Xl); Read(F, X2); ...; Read(F, XN);

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

Процедура Close выполняет закрытие файла F.

Пример 3.2. Из созданного программой Prim31 файла c именем D:\APPDOS\FP1.DAT вывести на экран информацию о студентах, родившихся в 1985 г.. Полученные данные записать (для отчета) в файл с именем D:\APPDOS\FP2.DAT.

Решение.

Возможный вариант программы:

Program Prim32;

Type

Stud = Record

Fio : String;

Year : Integer;

End;

Var

St : Stud;

F1, F2 : File of Stud;

Begin

Assign(F1, 'D:\APPDOS\FP1.DAT');

Assign(F2, 'D:\APPDOS\FP2.DAT');


Reset(F1);

Rewrite(F2);

Writeln('Список студентов, родившихся в 1985 году');

{ Пока не достигнут конец файла F1, осуществляется считывание из него данных, их обработка и запись в новый файл}

While Not EOF(F1) Do

Begin

{Чтение записи из файла}

Read(F1, St);

If St.Year = 1985 Then

Begin

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

Writeln(St.Fio, St.Year:6);

{Вывод записи в файл}

Write(F2, St);

End;

End;

Close(F1);

Close(F2);

End.

Заметим, что в этом примере мы используем файл D:\APPDOS\FP1.DAT, пребывая в полной уверенности, что такой файл на диске существует. Действительно, в предыдущем примере мы создали такой файл. Однако если делается попытка инициировать чтение несуществующего файла, возникает ошибка периода исполнения, которая может быть сообщена программе ненулевым значением функции IOResult. Поэтому более правильно было бы убедиться в наличии файла на диске прежде, чем начать работу с файлом в новой программе. Ниже приводится вариант программы, в которой устанавливается существование требуемого файла на диске:

Program Prim32а;

Label 10;

Type

Stud = Record

Fio : String;

Year : Integer;

End;

Var

St : Stud;

F1, F2 : File of Stud;

Begin

Assign(F1, 'D:\APPDOS\FP1.DAT');

{$I-}

Reset(F1);

{$I+}

If IOResult <> 0 Then

Begin

Writeln(‘Файл не существует’);

GoTo 10

End

Else

Begin

Assign(F2, 'D:\APPDOS\FP2.DAT');

Rewrite(F2);

Writeln('Список студентов, родившихся в 1985 году');

{ Пока не достигнут конец файла F1, осуществляется считывание из него данных, их обработка и запись в новый файл}

While Not EOF(F1) Do

Begin

{Чтение записи из файла}

Read(F1, St);

If St.Year = 1970 Then

Begin

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

Writeln(St.Fio, St.Year:6);

{Вывод записи в файл}

Write(F2, St);

End;

End;

Close(F1);

Close(F2);

10: End;

End.

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

Решение.

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

Программа

Program Prim33;

Var

F : File of Real;

S, X : Real;

N : Integer;

Begin

Assign(F, ‘File1.Dat’);

Reset(F);

N:=0;

S:=0;

Repeat

Read(F, X);

If X > 0 Then

Begin

S := S + X;

N := N + 1;

End;

Until Eof(F);

S := S / N;

Writeln(‘Среднее арифметическое = ‘, S);

End.

Мы рассмотрели два основных действия над последовательными файлами: их чтение и запись. Все остальные действия представляют собой сочетание записи и чтения файла.


Добавление данных к файлу


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

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

1) открыть уже существующий файл F процедурой Reset;

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

Seek(F,FileSize(F));

3) записать дополнительные данные (Write);

4) закрыть файл (Close).


Пример 3.4. Пусть уже создан файл F, состоящий из целых чисел 1, 2, 3, 4, 5. Необходимо добавить к этому файлу числа 10, 20, 30.


Решение.

Возможный вариант программы:

Program Рrim34;

Var

F : File of Integer;

I,X : Integer;

Begin

Assign(F, 'F');

Reset(F);

Seek(F, FileSize(F));

For I :=1 to 3 do

Begin

X:=10*I;

Write(F, I)

End;

Close(F);

End.

В результате выполнения программы получим файл F, состоящий из чисел 1, 2, 3, 4, 5, 10, 20, 30.


Поиск заданного элемента файла


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

1) открыть файл для чтения (Reset);

2) читать файл, пока не будет найден нужный элемент (Read);

3) закрыть файл.

Пример 3.5. Во внешнем файле с именем Sessia.Dat хранится информация о результатах экзаменационной сессии студентов. Каждый элемент этого файла представляет собой запись, состоящую из полей: ФИО, номер группы и четыре оценки. Написать программу, которая по введенным с клавиатуры ФИО и номеру группы представляет на экране монитора сведения о результатах сдачи экзаменов данным студентом.

Решение.

Возможный вариант программы:

Program Prim35;

Type

Zap = Record

Fio, NumGr : String;

Oc : Array [1..4] of Byte;

End;

Var

Sessia : File of Zap;

S : Zap;

F, N : String;

Begin

Assign(Sessia, 'Sessia.Dat');

Reset(Sessia);

Write(' Введите ФИО студента ');

Readln(F);

Write('Введите номер группы ');

Readln(N);

Repeat

Read(Sessia, S);

Until (S.Fio = F)And(S.NumGr = N) Or Eof(Sessia);

IF (S.Fio = F) And (S.NumGr = N) Then

Writeln('ФИО ',S.Fio,' Группа',S.NumGr:5,' Оценки: ', S.Oc[1]:4,S.Oc[2]:4,S.Oc[3]:4,S.Oc[4])

Else Writeln('Запись не найдена');

Close(Sessia);

End.


Корректировка элементов файла


Для проведения корректировки необходимо выполнить сле­дующие действия:

1) открыть корректируемый файл (Reset);

2) определить корректируемый элемент;

3) подвести указатель файла к корректируемому элементу (с по­мощью Seek);

4) считать корректируемый элемент (Read);

5) откорректировать элемент файла;

6) повторить процедуру подвода указателя файла (Seek);

7) записать откорректированный элемент (Write);

8) закрыть файл (Close).

Пример 3.6. Пусть уже соз­дан файл F, содержащий числа 1, 2, 3, 4, 5. Необходимо вместо последних трех элементов файла F записать числа 30, 40, 50.

Решение.

Программа

program Prim36;

Var

F : File of Integer;

X, I : Integer;

Begin

Assign(F, 'F');

Reset(F);

For I := 3 to 5 do

begin

Seek(F, I-1);

Read(F, X);

X := 10*I;

Seek(F, I-1);

Write(F,X)

end;

Reset(F);

While not Eof(F) do

Begin

Read(F, X);

Writeln(X)

end;

Close(F);

end.

Удаление элемента из файла


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

Пример 3.7. Из внешнего файла с именем D:\APPDOS\ FP1.DAT, созданным в примере 3.1, удалить все записи о студентах, родившихся до 1980 года.

Решение.

Программа

Program Prim37;

Type

Stud = Record

Fio : String;

Year : Integer;

End;

Var

F, FV : File of Stud; {F - внешний файл, FV - вспомогательный файл}

S : Stud;

Begin

Assign(F, 'D:\APPDOS\FP1.DAT');

Assign(FV, 'D:\APPDOS\FP3.DAT');

{запись в вспомогательный файл отобранных записей}

Reset(F);

Rewrite(FV);

While Not EOF(F) Do

Begin