Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 8 лет назад пользователемМаксим Казаченко
1 Файловые типы Файл - это последовательность из произвольного числа элементов одного и того же типа. Тип этих элементов называется базовым типом файла. f a b c d - файл - маркер f c - буфер type = ; где ::= file of Здесь file (файл) и of – служебные слова, а «тип» - это базовый тип файла, т.е. тип его элементов. Базовый тип может быть любым бес файловым типом. Тип является бес файловым, если в состав его объектов не входят файлы, т.е. к бес файловым не относятся файловые типы, а также массивы и записи, содержащие файлы.
2 Файлы – это единственный тип данных Паскаля, которые нельзя присваивать. 1) Проверка на конец файла (end of file). eof(f) - эта логическая функция принимает значение true, если маркер файла в данный момент указывает на конец файла f, т.е. на позицию вслед за последним элементом файла, и принимает значение false, если маркер указывает на какой-то элемент файла. Условно это легко изобразить так: f a b cf a b c eof(f)=true eof(f)=false
3 2) Считывание из файла Предположим, что переменная f уже имеет значение, т.е. в файле f уже есть какие-то элементы, и мы хотим организовать считывание из этого файла. Тогда прежде всего надо установить маркер файла на его начало, для чего используется процедура reset(f) Она устанавливает маркер файла f на его первый элемент, после чего копию этого элемента заносит в буферную переменную f: f a b c==> reset(f) ==>f a b c f f ca get(f) Эта процедура передвигает маркер на следующий элемент, после чего заносит копию этого элемента в буфер f: f a b c==> get(f) ==>f a b c f a f b
4 Пример. Пусть var G:file of real; S:real; и надо найти S - сумму элементов файла G. S:=0; reset(G); {установка на начало G, 1-е число в G } while not eof(G) do {пока G не пуст, выполнять} begin S:=S+G ; {добавить в S очередное число} get(G) {перейти к следующему элементу файла} end read(f,x) где х - переменная базового типа файла f. Действия этой процедуры в точности эквивалентны x:=f ; get(f) S:=0; reset(G); while not eof(G) do begin read(G,x); S:=S+x end;
5 3) Запись в файл Сразу отметим, что записывать в файл можно только от его начала, но не от середины. Поэтому прежде чем начать запись в файл, надо "перемотать" его на начало, для чего используется процедура: rewrite(f) Она уничтожает все элементы файла f (если такие были), т.е. делает файл пустым, а затем устанавливает маркер файла на первую (ставшую пустой) позицию файла f. В этот момент eof(f)=true, а значение f не определено: f a b c d==> rewrite(f) ==>f f c f значение не определено eof(f)=true Запись в файл осуществляется процедурой: put(f) которая добавляет в конец файла новый элемент, значение которого берется из буферной переменной f. После этого маркер сдвигается на позицию вслед за только что записанным элементом, а буферная переменная f очищается, т.е. ее значение считается неопределенным: f a b ==> put(f) ==>f a b c f c f eof(f)=true eof(f)=true rewrite(f) ==>f f c f значение не определено eof(f)=true Запись в файл осуществляется процедурой: put(f) которая добавляет в конец файла новый элемент, значение которого берется из буферной переменной f. После этого маркер сдвигается на позицию вслед за только что записанным элементом, а буферная переменная f очищается, т.е. ее значение считается неопределенным: f a b ==> put(f) ==>f a b c f c f eof(f)=true eof(f)=true">
6 Пример. var T1: file of char; Записать в Т1 все латинские буквы, вставляя после каждой из них пробел. Решение запишется следующим образом: rewrite(T1); {установка на начало Т1 + очистка} for c:='a' to 'z' do begin T1 :=c; put(T1); {запись в Т1 очередной буквы} T1 :='_'; put(T1); {запись пробела} end; write(f,x) где х - выражение базового типа файла f. Эта процедура полностью эквивалентна паре операторов f:=x; put(f) Пример. В Паскале не допускается присваивание файлов. Но иногда все же нужно переписать информацию из одного файла в другой (скажем, из f в g). Эту перепись надо реализовывать самому. Опишем эту перепись в виде следующей процедуры: type Ф = file of T; {где Т - любой тип} procedure перепись(var f,g: Ф); var x: T; begin reset(f); rewrite(g); while not eof(f) do begin read(f,x); write(g,x) end end;
7 Текстовые файлы (тексты) 1)Стандартный тип text. Стандартные файлы input и output var t, книга: text; 2) Деление на строки t a b c # d # e f #... 1-я 2-я 3-я - строки eoln(t) t a b c # d #... t b eoln(t)=false t _ eoln(t)=true
8 Пример. Определить количество строк в тексте t: Представим решение задачи в виде описания функции function nm_line (var t: text): integer; var k : integer; begin k:=0; reset(t); while not eof(t) do begin if eoln(t) then k:=k+1; get(t) end; nm_line:= k end; readln(t) Эта процедура пропускает все очередные символы текста t вплоть до ближайшего «конца строки» и устанавливает маркер файла на символ, следующий за этим «концом строки»: t a b c # d #...==> readln(t) ==>t a b c # d #... t b t d Более точно, readln(t) - это сокращение для: while not eoln(t) do get(t); get(t)
9 writeln(t) Это стандартная процедура записывает в конец текстового файла символ «конец строки»: t a b c d ==> writeln(t) ==>t a b c d # Расширение возможности чтения-записи а) Процедура read Пусть t - текстовый файл, а х i - переменные типа char, integer или real. Тогда: read(x 1,x 2,...,x n ) read(input,x 1,x 2,...,x n ) т.е. при чтении из файла input, то имя input можно опускать, чем мы уже давно пользуемся. read(t,x 1,...,x n ) read(t,x 1 );...; read(t,x n ) б) Процедура readln readln(x 1,x 2,...,x n ) readln(input,x 1,x 2,...,x n ) readln(t,x 1,x 2,...,x n ) read(t,x 1,x 2,...,x n ); readln(t) в) Функции eof и eoln eof eof(input) eoln eoln(input) г) Процедура write write(p 1,p 2,...,p n ) write(output,p 1,p 2,...,p n ) Таким образом, при записи в выходной файл имя output можно опускать. write(t,p 1,p 2,...,p n ) write(t,p 1 );...; write(t,p n ) Здесь параметр p i - параметр вывода: е, е:m, e:m:n
10 д) Процедура writeln writeln(p 1,p 2,...,p n ) writeln(output,p 1,p 2,...,p n ) writeln(t,p 1,p 2,...,p n ) write(t,p 1,p 2...,p n ); writeln(t) Внутренние и внешние файлы диск АБИТ СТУД программа дисплей рис. а F F ВП ОП рис. б
11 Пример. Пусть во внешнем файле с именем АБИТ записана информация обо всех абитуриентах, сдававших приемные экзамены, и пусть стал известным проходной бал. Требуется из всех абитуриентов отобрать тех, сумма баллов у которых не меньше проходного балла, и записать сведения о них в другой внешний файл с именем СТУД. Кроме того, надо вывести на экран дисплея количество таких абитуриентов. program зачисление(input,output,АБИТ,СТУД); type строка = array[1..15] of char; анкета = record ФИО: record фам, имя, что : строка end; оцен: array[1..4] of 2..5; {другая информация: пол, возр и т.д.} end; var АБИТ,СТУД: file of анкета; ПБ: ; {проходной балл} Б,N,i: integer; semafor: boolean;
12 begin writeln('Сообщите_проходной_балл:'); read(ПБ); reset(АБИТ); rewrite(СТУД); N:=0; {число зачисленных студентов} repeat Б:=0; semafor:=true; for i:=1 to 4 do if АБИТ.оцен[i]>2 then Б:=Б+АБИТ.оцен[i] else semafor:=false; if semafor and (Б>ПБ) then begin N:=N+1; write(СТУД,АБИТ ) end; get(АБИТ); until eof(АБИТ); writeln('Зачислено ',N,' человек') end.
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.