ФайлыФайлы2 1.Общие сведения о файлах и файловой системе 2.Файлы языка Паскаль 3.Текстовые файлы 4.Типизированные файлы 5.Примеры решения задач обработки.

Презентация:



Advertisements
Похожие презентации
1 Программирование на языке Паскаль Файлы с последовательным доступом. Кулебякин В.В.
Advertisements

1 Программирование на языке Паскаль Тема: Файлы. Integer, Real, Boolean, Character, String, Text.
Программирование на языке Паскаль Типизированные файлы.
Файловая переменная. Файл – совокупность данных, записанная во внешней памяти под определенным именем. Любой файл имеет три характерные особенности: уникальное.
Файловый тип данных Turbo Pascal Операции для работы с файлами 11 класс.
Множества значений или переменных с одним общим именем называются структурированными типами. По способу организации и типу компонентов выделяют: 1. Массивы.
Работа с файлами.. Процедура Assign(var f; name : String); Связывает внешний файл с именем name и переменную файлового типа f. Все дальнейшие операции.
Файловый тип данных Файл – это область памяти на внешнем носителе, в которой хранится некоторая информация. В языке Паскаль файл представляет собой последовательность.
Файлы и папки © К.Ю. Поляков, 2007 (файловая система)
Файлы и папки (файловая система). 2 Определения Файл – набор данных на диске, имеющий имя. Имя файла: 255 символов, нельзя \ / : * ? | Реферат по истории.doc.
Программирование на языке Паскаль Текстовые файлы.
Текстовые файлы Вербицкая Ольга Владимировна, Заозерная школа 16.
Файлы - именованная область внешней памяти ЭВМ, хранящая совокупность данных. Файл.
Глава 9. ВВОД-ВЫВОД ДАННЫХ И ФАЙЛОВАЯ СТРУКТУРА Логический и физический файлы Типы файловой переменной Общие процедуры работы с файлами Текстовые файлы.
1 Файловый тип данных Файл – это область памяти на внешнем носителе, в которой хранится некоторая информация. Файл – это набор данных, хранящихся во внешней.
Нетипизированный файл рассматривается в Паскале как совокупность символов или байтов. Выбор char или byte не играет никакой роли, важен лишь объем занимаемых.
Файловая система Подготовила Фриц Ксения 11 «б» класса.
Урок 2. Информационные процессы в обществе и природе.
Программирование типовых алгоритмов вычислений Информатика.
Массивы 9 класс. Основные теоретические сведения Примеры решения задач.
Транксрипт:

Файлы

2 1.Общие сведения о файлах и файловой системе 2.Файлы языка Паскаль 3.Текстовые файлы 4.Типизированные файлы 5.Примеры решения задач обработки файлов Содержание

3 1. Общие сведения о файлах и файловой системе

4 Файлом называют именованную последовательность элементов данных (компонент файла), расположенных, как правило, во внешней памяти: на дискетах, винчестере, CD или других устройствах хранения информации, также устройствах ввода-вывода. В файле может храниться текст, программа, числовые данные, графическое изображение и т.д. Для организации работы с файлами программа на языке Паскаль взаимодействует с операционной системой. Определение

5 Файл – набор данных на диске, имеющий имя. Имя файла: 255 символов, нельзя \ / : * ? | Курсова по ОАиП.doc персональное имя расширение («фамилия») расширение («фамилия»).exe,.com Исполняемые программы.txt Текст без оформления.doc,.docx Документ (текст + рисунки + …).bmp,.gif,.jpg Рисунки.wav,.mid,.mp3 Звук.avi,.mpg,.wmv Видеофильмы.pas,.c,.bas Тексты программ

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

Файловая система 7 одноуровневая каталогфайлы vasya.txt 360 байт Примеры.doc 13 Кб Я.bmp 1,28 Мб vasya.txt 360 байт Примеры.doc 13 Кб Я.bmp 1,28 Мб номер начального блока (кластера) на диске размер дата изменения самый простой вариант все файлы «в куче», сложно разбираться ограниченный объем каталога (512 записей) Файловая система – это порядок размещения файлов на диске.

8 Файловая система многоуровневая (дерево) Диск C: autoexec.bat Документы План.doc Отчет.doc Фото Видео Кузя.avi Винни-Пух.wmv 2006 Я.jpg Шарик.jpg 2007 Ку.jpg Зя.jpg Корневой каталог – главный каталог диска. Вложенная папка (подкаталог) – это папка, расположенная внутри другой папки. Папка (каталог) – объединяет файлы и вложенные папки файлы Файлы в корневом каталоге папка

9 Файловая система многоуровневая (дерево) Рабочая папка (текущий каталог) – папка, с которой в данный момент работает пользователь. Диск C: Документы Видео дерево папок: Фото корень

10 Адреса файлов Какие файлы находятся в корневом каталоге? ? C:\Фото\2013\Ку.jpg диск папки имя файла \\SERVER\Видео\2013\Зя.avi имя компьютера C:\SERVER\Видео\2013\Зя.avi A:\autoexec.bat \\work3\Игры\Hover\hover.exe D:\Windows\Temp\Справка.txt E:\Реферат.doc C:\SERVER\Видео\2013\Зя.avi A:\autoexec.bat \\work3\Игры\Hover\hover.exe D:\Windows\Temp\Справка.txt E:\Реферат.doc Сетевой адрес: Примеры: Полный адрес файла = путь + имя файла Путь к файлу – это перечисление папок (каталогов), в которых он находится, сверху вниз (начиная с диска).

11 Папки Windows Мои документы Корзина Мой компьютер Сетевое окружение Мои рисунки Моя музыка Мои видеозаписи Диск С: Вся сеть Диск D: Диск A: Диск E: Диск F: Диск Z: Учебники на Server Задания на Server Рабочий стол сетевые ресурсы сетевой диск флэш-диск CD (DVD)

12 Логические диски в Windows A:, B: дискеты C: винчестер, загрузочный диск D: … Z: винчестер, CD, DVD, флэш-диск, сетевой диск ( X: \\SERVER\Игры ) дисковод C: D: E:

13 2. Файлы языка Паскаль

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

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

16 Разновидности файлов Файлы только текст без оформления, не содержат управляющих символов (с кодами < 32) ACSII (1 байт на символ) UNICODE (2 байта на символ) *.txt, *.log, *.htm, *.html могут содержать любые символы кодовой таблицы *.doc, *.exe, *.bmp, *.jpg, *.wav, *.mp3, *.avi, *.mpg Текстовые Бинарные Папки (каталоги) возможно создавать, просматривать и редактировать "вручную" - в любом текстовом редакторе; при считывании данных не требуется заботиться об преобразовании информация записывается по байтам и потому не доступна для просмотра или редактирования в удобных для человека текстовых редакторах; зато такие файлы более компактны, чем текстовые

17 Бинарные файлы бывают двух видов типизированные, нетипизированные. К типизированным относятся файлы, содержащие данные строго определенного типа. Обычно такие файлы представляются собой наборы записей. К нетипизированным относятся двоичные файлы, которые могут содержать любые совокупности байтов данных без привязки к какому-нибудь одному типу. Разновидности файлов

18 Логические устройства используют для организации обмена информацией с основными устройствами ввода- вывода, такими как дисплей, клавиатура и т.п. Логические устройства имеют стандартные имена, например: CON – консоль: при выводе данных соответствует экрану, при вводе – клавиатуре; PRN – принтер; NUL – «пустое устройство», обычно заменяет устройство вывода отладочной информации после завершения отладки программы. Логические устройства

19 В отличие от дисковых файлов с логическими устройствами операции ввода-вывода осуществляют только последовательно, так как при выполнении операций вывода данные передаются на устройство покомпонентно, а при выполнении операций ввода – покомпонентно запрашиваются с него. Логические устройства

20 Физически операции ввода-вывода с файлами выполняются с использованием специального буфера. Так, выводимые записи вначале помещаются в буфер, откуда переписываются в файл по мере заполнения буфера, а вводимые читаются из буфера, куда они были предварительно помещены. Использование буферов позволяет существенно повысить скорость выполнения операций ввода- вывода с файлом, так как на одну операцию ввода- вывода с дисководом, которая выполняется сравнительно медленно, обычно приходятся десятки операций чтения из буфера. Организация файла

21 Для дисковых файлов принципиально возможны: не только последовательный, но и произвольный доступ, при котором чтение информации осуществляется из указанного места. Организация файла

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

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

24 Файловая переменная типизированного файла описывается как: Описание типизированных файлов Туре = file оf ; где - любой тип данных, кроме файлового. Типизированные файлы используют, когда обрабатывают хранящуюся в файле последовательность компонентов одинаковой длины (чисел, записей и т.п.).

25 Файловая переменная текстового файла описывается как: Описание текстовых файлов Туре = text; Текстовые файлы используют для работы с текстами, представленными в виде строк переменной длины.

26 Файловая переменная нетипизированного файла описывается как: Описание нетипизированных файлов Туре = file; Нетипизированные файлы применяют для организации скоростного обмена между внешней и оперативной памятью физическими записями указанной длины без преобразования и обработки.

27 Как и любая переменная языка Паскаль, файловая переменная может быть описана в инструкции объявления переменных. Например: Описание файлов Var F1: file of real; F2: file; F3: text; Var F1: file of real; F2: file; F3: text; или с предварительным объявлением типа: Туре FF = file of integer; VarF1: FF; Туре FF = file of integer; VarF1: FF;

28 При необходимости файловую переменную допускается передавать в подпрограмму через параметры. Однако следует помнить, что с этой целью можно использовать только параметры-переменные. Например: Описание файлов Туре FF = file of integer; Procedure Print (Var F1:FF); Туре FF = file of integer; Procedure Print (Var F1:FF);

29 Работа с файлом включает: инициализацию файловой переменной – установление связи файловой переменной с файлом; открытие файла – подготовку файла для выполнения операций ввода/вывода; обработку компонентов файла – выполнение операций ввода-вывода; закрытие файла (при повторном открытии файл закрывается автоматически).

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

31 Например: Инициализация файловой переменной Туре F = text; Var f1, f2, f3: F;... Assign (fl, 'T1.dat'); {связывание файловой переменной с файлом в текущем каталоге} Assign (f2, 'd:\iva\a.dat'): {связывание файловой переменной с файлом в указанном каталоге} Assign(f3, 'CON'); {связывание файловой переменной с консолью} Туре F = text; Var f1, f2, f3: F;... Assign (fl, 'T1.dat'); {связывание файловой переменной с файлом в текущем каталоге} Assign (f2, 'd:\iva\a.dat'): {связывание файловой переменной с файлом в указанном каталоге} Assign(f3, 'CON'); {связывание файловой переменной с консолью}

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

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

34 При открытии для чтения несуществующего файла регистрируется ошибка выполнения, а функция lOResult типа Word возвращает значение, отличное от 0 (см. далее описание функции). Отключив контроль операций ввода-вывода и используя функцию lOResult, можно организовать проверку наличия файла с указанным именем на диске: Открытие файла Var f: file of char; Begin Assign(f, 'a.dat'); {инициализация файловой переменной} {$ I- } {отмена контроля ошибок ввода-вывода } ReSet (f); {открытие файла для чтения} {$ I+ } {включение контроля ошибок} if IOResult 0 then WriteLn ('Файл не существует'); else WriteLn('Файл существует'); Var f: file of char; Begin Assign(f, 'a.dat'); {инициализация файловой переменной} {$ I- } {отмена контроля ошибок ввода-вывода } ReSet (f); {открытие файла для чтения} {$ I+ } {включение контроля ошибок} if IOResult 0 then WriteLn ('Файл не существует'); else WriteLn('Файл существует');

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

36 Процедура Открытие файла открывает текстовый файл, определенный файловой переменной f, для добавления строк. При открытии для добавления строк указатель файла устанавливается на конец файла, и, соответственно, все строки, выводимые в файл, дописываются к уже существующему файлу. AppEnd(Var f: text)

37 Любой программе без объявления, инициализации файловой переменной и открытия доступны два файла со стандартными файловыми переменными: INPUT – чтение со стандартного устройства ввода; OUTPUT – вывод на стандартное устройство вывода. Это текстовые файлы, используемые для выполнения элементарных операций ввода-вывода. В операторах ввода-вывода файловые переменные этих файлов обычно не указывают. Остальные файлы становятся доступными только после связывания файловой переменной с файлом или логическим устройством и открытия файла. Стандартным устройством ввода по умолчанию является клавиатура. Стандартным устройством вывода – экран дисплея. Открытие файла

38 На базе этих операций выполняют более сложные операции: создание файла – занесение в файл требуемых записей; модификация файла – изменение всех или нескольких записей, добавление и удаление записей; поиск нужной информации в файле. Выполнение этих операций осуществляется по-своему для каждого типа файла (см. параграфы далее). Обработка компонентов файла

39 Закрытие файла, открытого для записи или чтения, осуществляется процедурой Закрытие файла Close(Var f) При этом вновь созданный файл регистрируется в каталоге. ! Поскольку любое обращение к диску осуществляется через буферную память, часть данных, выводимых в файл, может остаться в буфере. Процедура закрытия файла обеспечивает вывод оставшихся компонентов из буфера в файл. Связь файловой переменной с файлом при закрытии сохраняется, и при повторном использовании этого же файла процедуру Assign применять еще раз не требуется.

40 Принцип сэндвича I этап. открыть файл : связать переменную f с файлом открыть файл (сделать его активным, приготовить к работе) assign(f, 'qq.txt'); reset(f); {для чтения} rewrite(f); {для записи} II этап: работа с файлом Переменная типа «текстовый файл»: var f: text; III этап: закрыть файл close(f); read ( f, n ); { ввести значение n } write ( f, n ); { записать значение n } writeln ( f, n );{c переходом на нов.строку } write ( f, n ); { записать значение n } writeln ( f, n );{c переходом на нов.строку }

41 Работа с файлами Особенности: имя файла упоминается только в команде assign, обращение к файлу идет через файловую переменную файл, который открывается на чтение, должен существовать если файл, который открывается на запись, существует, старое содержимое уничтожается данные записываются в файл в текстовом виде при завершении программы все файлы закрываются автоматически после закрытия файла переменную f можно использовать еще раз для работы с другим файлом

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

43 Процедура Стандартные процедуры и функции обслуживания файлов осуществляет переименование файла, определенного файловой переменной f. Новое имя файла задается параметром name. Если в процессе работы программы требуется переименовать файл, открытый для чтения или записи, необходимо предварительно закрыть этот файл. При совпадении нового имени файла с каким-либо уже существующим выдается сообщение об ошибке. ReName(Var f, name: string)

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

45 Функция Стандартные процедуры и функции обслуживания файлов определяет конец файла. Как было отмечено выше, размер файла при его создании не фиксируется. Поэтому в процессе работы требуется проверка достижения конца файла. Функция принимает значение TRUE, если указатель стоит в конце файла (после последней записи). При этом, если производится чтение, то это означает, что файл исчерпан, а если идет запись, то новая запись дописывается в конец файла. Функция принимает значение FALSE, если конец файла еще не достигнут. EOF(Var f):boolean

46 Функция Стандартные процедуры и функции обслуживания файлов возвращает код правильности выполнения операций ввода/вывода. Если ошибок не зафиксировано, то функция возвращает 0. Информация об ошибках может быть получена и обработана в режиме компилятора {$ I-} – отключение контроля ошибок ввода/вывода. IOResult(Var f): word

47 Процедура Стандартные процедуры и функции обслуживания файлов обрезает файл, оставляя компоненты до того, на который ссылается указатель файла (кроме текстовых файлов). Truncate(Var f)

48 Процедура Стандартные процедуры и функции обслуживания файлов изменяет текущий каталог: назначает текущим каталог, указанный параметром path. ChDir(path: string)

49 Процедура Стандартные процедуры и функции обслуживания файлов возвращает в переменную dir имя текущего каталога на указанном устройстве, где устройство drive: 0 – устройство по умолчанию; 1 – диск А; 2 – диск В и т.д. GetDir(drive: word, Var dir: string)

50 Процедура Стандартные процедуры и функции обслуживания файлов создает новый каталог. Строка dir определяет путь и новое имя. MkDir(dir: string) Процедура удаляет каталог с именем, указанным в переменной dir. Каталог должен быть пустым. RmDir(dir: string)

51 3. Текстовые файлы

52 Текстовый файл - это файл, компонентами которого являются символьные строки переменной длины, заканчивающиеся специальным маркером конца строки: Структура текстового файла Маркер конца строки - это последовательность из двух специальных символов по таблице ASCII «#13, #10». Символ с кодом 13 интерпретируется в компьютере как команда установки курсора в начало строки, а символ с кодом 10 - как команда перехода на следующую строку. Такая комбинация кодов вводится при нажатии клавиши ENTER.

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

54 Текстовые файлы используют для хранения и обработки текстовой информации: символов, строк, символьных массивов. Логические и числовые данные при записи в текстовые файлы должны преобразовываться в символьные строки. Следует иметь в виду, что при необходимости текстовый файл может быть создан или прочитан любым текстовым редактором, в том числе и текстовым редактором.

55 Функция Стандартные процедуры и функции обслуживания текстовых файлов возвращает TRUE, если во входном текстовом файле достигнут маркер конца строки. При отсутствии файловой переменной проверяется стандартный файл INPUT, который обычно связан с клавиатурой. EOLn( Var f): boolean

56 Процедура Стандартные процедуры и функции обслуживания текстовых файлов обеспечивает ввод символов, строк и чисел. Список ввода представляет собой последовательность из одной или более переменных типа CHAR, STRING, а также любого целого и вещественного типа. При отсутствии файловой переменной ввод осуществляется из стандартного файла INPUT. Read( Var f: text, vl..vn)

57 Стандартные процедуры и функции обслуживания текстовых файлов При вводе значений переменных типа CHAR выполняется чтение одного символа из файла, считанное значение присваивается очередной переменной из списка ввода. Символы вводятся подряд, а не через пробел, как числа. Если перед выполнением чтения указатель файла достиг конца очередной строки, то результатом чтения будет символ #13, а если был достигнут конец файла, то – символ #26.

58 Стандартные процедуры и функции обслуживания текстовых файлов: Read При вводе переменных типа STRING количество считанных процедурой и помещенных в строку символов равно максимальной длине строки, если раньше не встретились маркеры конца строки или конца файла, которые в строку не включаются. Символы, выходящие за размер максимальной длины строки, отбрасываются. Новое обращение к процедуре Read вернет пустую строку. Следовательно, процедура Read не в состоянии читать последовательность строк, так как первая строка будет прочитана правильно, а все последующие окажутся пустыми. !

59 При вводе числовых данных процедура Read пропускает все пробелы, знаки табуляции и маркеры до первого значащего символа и читает строку до пробела, знака табуляции или маркера. Полученная подстрока преобразуется из символьного во внутреннее представление в соответствии с типом значения и присваивается следующей переменной из списка. Если нарушен формат, то фиксируется ошибка ввода- вывода. Если достигнут маркер конца файла, то переменной присваивается значение 0, причем никаких сообщений в этом случае не выдается. Стандартные процедуры и функции обслуживания текстовых файлов: Read

60 Ввод логических констант процедурами Read и ReadLn не предусмотрен. Чтение с клавиатуры осуществляется через буфер, который передается процедуре при нажатии клавиши ENTER и имеет размер 127 байт, поэтому ввести с клавиатуры строку большего размера нельзя. Стандартные процедуры и функции обслуживания текстовых файлов: Read

61 Процедура Стандартные процедуры и функции обслуживания текстовых файлов также обеспечивает ввод символов, строк и чисел. Процедура использует те же правила ввода, что и процедура Read, но после чтения последней переменной оставшаяся часть строки до маркера конца строки пропускается, так что следующее обращение к ReadLn или Read начнется с первого символа новой строки. Процедура может быть вызвана без указания списка ввода, что приведет к пропуску всех символов текущей строки до маркера конца строки. ReadLn( Var f, vl..vn)

62 Процедуры Read и ReadLn могут использоваться без указания файловой переменной. Тогда операция чтения осуществляется из стандартного файла INPUT. Использование процедуры ReadLn без параметров после процедуры Read приведет к очистке буфера ввода. Применение этой же процедуры без предшествующей ей процедуры Read переводит программу в состояние ввода, т.е. выполнение программы приостанавливается до нажатия клавиши ENTER, что может использоваться для организации паузы на время просмотра содержимого экрана. Стандартные процедуры и функции обслуживания текстовых файлов

63 Последовательный доступ при открытии файла курсор устанавливается в начало чтение выполняется с той позиции, где стоит курсор после чтения курсор сдвигается на первый непрочитанный символ конец файла (end of file, EOF) конец файла (end of file, EOF) assign ( f, 'qq.txt' ); reset ( f ); assign ( f, 'qq.txt' ); reset ( f ); read ( f, x );

64 чтение до конца строки как вернуться назад? Последовательный доступ close ( f ); reset ( f ); { начать с начала } close ( f ); reset ( f ); { начать с начала } readln ( f, x ); ¤ 36 67¤ 56 конец строки (end of line, EOL) конец строки (end of line, EOL)

65 Процедура Стандартные процедуры и функции обслуживания текстовых файлов обеспечивает вывод данных в текстовый файл или передачу их на логическое устройство. Список вывода – последовательность из одного или более выражений типа CHAR, STRING, BOOLEAN, а также целого или вещественного типов. При выводе числовых значений последние преобразуются в символьное представление. При отсутствии файловой переменной вывод осуществляется в стандартный файл OUTPUT, который обычно назначен на экран. Write( Var f, vl..vn)

66 Любой параметр из списка вывода может иметь формат: Стандартные процедуры и функции обслуживания текстовых файлов где и интерпретируются в соответствии с правилами, описанными в параграфе «Ввод-вывод данных» Темы 2 [: [: ]],

67 Процедура Стандартные процедуры и функции обслуживания текстовых файлов обеспечивает вывод информации в текстовый файл или ее передачу на логическое устройство вывода. При отсутствии файловой переменной вывод осуществляется в стандартный файл OUTPUT, который обычно связан с дисплеем. Процедура полностью идентична процедуре Write, за исключением того, что выводимая строка символов завершается символами #13 и #10. При вызове WriteLn допускается опускать список вывода, в этом случае в файл передается маркер конца строки (при выводе на экран это приведет к переводу курсора в начало следующей строки). WriteLn( Var f, vl..vn)

68 Функция Стандартные процедуры и функции обслуживания текстовых файлов пропускает все пробелы и знаки табуляции до маркера конца строки или до первого значащего символа и возвращает TRUE при обнаружении маркера. Если файловая переменная не указана, то функция проверяет стандартный файл INPUT. SeekEOLn( Var f ):boolean

69 Функция Стандартные процедуры и функции обслуживания текстовых файлов пропускает все пробелы, знаки табуляции и маркеры конца строки до маркера конца файла или до первого значащего символа и возвращает TRUE при обнаружении маркера. Если файловая переменная отсутствует, то функция проверяет стандартный файл INPUT. SeekEOF( Var f ):boolean

70 Разработать программу, которая формирует текстовый файл из 26 строк, содержащих случайное количество соответствующих прописных букв латинского алфавита. Например: ААААА ВВВВВ С DDDDDDDDDDDDDDDDDDDDD ЕЕЕЕЕЕЕЕЕЕЕЕЕЕ и т.д. Пример 1

71 Пример 1 Program FormTextFile; Var f:text; {файловая переменная для текстового файла} а:char; n,i:integer; fname,st:string[30]; Begin WriteLn('Введите имя файла'); ReadLn(fname); Assign(f, fname); {инициализируем файловую переменную} ReWrite(f); {открываем файл для записи} Randomize; {инициализируем датчик случайных чисел} Program FormTextFile; Var f:text; {файловая переменная для текстового файла} а:char; n,i:integer; fname,st:string[30]; Begin WriteLn('Введите имя файла'); ReadLn(fname); Assign(f, fname); {инициализируем файловую переменную} ReWrite(f); {открываем файл для записи} Randomize; {инициализируем датчик случайных чисел}

72 Пример 1 for а:='А' to 'Z' do begin {формируем строки} n:=Random(30)+l; st:=; for i:=l to n do st:=st+a: WriteLn(f, st); {записываем строку в текстовый файл} WriteLn(st); {для контроля - выводим ее на экран} end; Close(f); {закрываем файл} End. for а:='А' to 'Z' do begin {формируем строки} n:=Random(30)+l; st:=; for i:=l to n do st:=st+a: WriteLn(f, st); {записываем строку в текстовый файл} WriteLn(st); {для контроля - выводим ее на экран} end; Close(f); {закрываем файл} End.

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

74 Разработать программу, которая удаляет из текстового файла «пустые» строки: строки, не содержащие символов, и строки, содержащие только пробелы и знаки табуляции. Поскольку в результате обработки часть строк текстового файла будет удалена, нам потребуется создать специальный файл, куда будут помещены непустые строки файла. Пример 2

75 Пример 2 Program ex; Var f1, f2:text; {файловые переменные текстовых файлов} st, name: string; Begin WriteLn('Введите имя файла:'); ReadLn(name); Assign(f1, name); {иниц-ем файловую переменную} {$I-} {проверяем существование файла} Reset(f1); {$I+} if IOResult=0 then begin {если файл с заданным именем существует} Assign(f2, 'temp.dat'); {иниц-ем новый файл} Rewrite(f2); {открываем новый файл для записи} Program ex; Var f1, f2:text; {файловые переменные текстовых файлов} st, name: string; Begin WriteLn('Введите имя файла:'); ReadLn(name); Assign(f1, name); {иниц-ем файловую переменную} {$I-} {проверяем существование файла} Reset(f1); {$I+} if IOResult=0 then begin {если файл с заданным именем существует} Assign(f2, 'temp.dat'); {иниц-ем новый файл} Rewrite(f2); {открываем новый файл для записи}

76 Пример 2 while not EOF(f1) do begin {пока не достигнут конец файла} if SeekEOLn(f1) then ReadLn(f1, St) {если строка пустая, то пропускаем ее} else begin ReadLn(f1, st); {читаем строку} WriteLn(f2, st); {записываем ее в новый файл} end; Close(f1); {закрываем старый файл} Close(f2); {закрываем новый файл} Erase(f1); {удаляем старый файл} ReName(f2, name); {переименовываем новый файл} end else WnteLn('Файл с таким именем не найден'); End. while not EOF(f1) do begin {пока не достигнут конец файла} if SeekEOLn(f1) then ReadLn(f1, St) {если строка пустая, то пропускаем ее} else begin ReadLn(f1, st); {читаем строку} WriteLn(f2, st); {записываем ее в новый файл} end; Close(f1); {закрываем старый файл} Close(f2); {закрываем новый файл} Erase(f1); {удаляем старый файл} ReName(f2, name); {переименовываем новый файл} end else WnteLn('Файл с таким именем не найден'); End.

77 Пример 3 Задача: в файле input.txt записаны числа (в столбик), сколько их – неизвестно. Записать в файл output.txt их сумму. Алгоритм: 1.Открыть файл input.txt для чтения. 2.S := 0; 3.Если чисел не осталось, перейти к шагу 7. 4.Прочитать очередное число в переменную x. 5.S := S + x; 6.Перейти к шагу 3. 7.Закрыть файл input.txt. 8.Открыть файл output.txt для записи. 9.Записать в файл значение S. 10.Закрыть файл output.txt. Можно ли обойтись без массива? ? цикл с условием «пока есть данные»

78 Пример 3 program qq; var s, x: integer; f: text; begin assign(f, 'input.txt'); reset(f); s := 0; close(f); end. program qq; var s, x: integer; f: text; begin assign(f, 'input.txt'); reset(f); s := 0; close(f); end. while not eof(f) do begin readln(f, x); s := s + x; end; while not eof(f) do begin readln(f, x); s := s + x; end; f: text; eof(f) логическая функция, возвращает True, если достигнут конец файла assign(f, 'output.txt'); rewrite(f); writeln(f, 'Сумма чисел ', s); close(f); assign(f, 'output.txt'); rewrite(f); writeln(f, 'Сумма чисел ', s); close(f); запись результата в файл output.txt

79 Задания В файле input.txt записаны числа, сколько их – неизвестно. «1»: Найти среднее арифметическое всех чисел и записать его в файл output.txt. «2»: Найти минимальное и максимальное числа и записать их в файл output.txt.

80 Пример 4: обработка массивов Задача: в файле input.txt записаны числа (в столбик), сколько их – неизвестно, но не более 100. Переставить их в порядке возрастания и записать в файл output.txt. Проблемы: 1.для сортировки надо удерживать в памяти все числа сразу (массив); 2.сколько чисел – неизвестно. Решение: 1.выделяем в памяти массив из 100 элементов; 2.записываем прочитанные числа в массив и считаем их в переменной N ; 3.сортируем первые N элементов массива; 4.записываем их в файл. Можно ли обойтись без массива? ?

81 Пример 4: чтение данных в массив var A: array[1..100] of integer; f: text; var A: array[1..100] of integer; f: text; function ReadArray: integer; var i: integer; begin assign(f, 'input.txt'); reset(f); i := 0; close(f); ReadArray := i; end; function ReadArray: integer; var i: integer; begin assign(f, 'input.txt'); reset(f); i := 0; close(f); ReadArray := i; end; Глобальные переменные: Функция: ввод массива, возвращает число элементов while (not eof(f)) and (i < 100) do begin i := i + 1; readln(f, A[i]); end; while (not eof(f)) and (i < 100) do begin i := i + 1; readln(f, A[i]); end; ReadArray := i; цикл заканчивается, если достигнут конец файла или прочитали 100 чисел

82 Пример 4 program qq; var A: array[1..100] of integer; f: text; N, i: integer; Begin N := ReadArray; { сортировка первых N элементов } end. program qq; var A: array[1..100] of integer; f: text; N, i: integer; Begin N := ReadArray; { сортировка первых N элементов } end. function ReadArray: integer;... end; assign(f, 'output.txt'); rewrite(f); for i:=1 to N do writeln(f, A[i]); close(f); assign(f, 'output.txt'); rewrite(f); for i:=1 to N do writeln(f, A[i]); close(f); вывод отсортированного массива в файл

83 Задания В файле input.txt записаны числа (в столбик), известно, что их не более 100. «3»: Отсортировать массив по убыванию последней цифры и записать его в файл output.txt. «4»: Отсортировать массив по возрастанию суммы цифр и записать его в файл output.txt.

84 Пример 5: обработка текстовых данных Задача: в файле input.txt записаны строки, в которых есть слово-паразит «короче». Очистить текст от мусора и записать в файл output.txt. Файл input.txt : Мама, короче, мыла, короче, раму. Декан, короче, пропил, короче, бутан. А роза, короче, упала на лапу, короче, Азора. Каждый, короче, охотник желает, короче, знать, где... Результат - файл output.txt : Мама мыла раму. Декан пропил бутан. А роза упала на лапу Азора. Каждый охотник желает знать, где сидит фазан.

85 Алгоритм: 1. Прочитать строку из файла ( readln ). 2. Удалить все сочетания ", короче," ( Pos, Delete ). 3. Записать строку в другой файл. 4. Перейти к шагу 1. Обработка строки s : Особенность: надо одновременно держать открытыми два файла (один в режиме чтения, второй – в режиме записи). пока не кончились данные repeat i := Pos(', короче,', s); if i 0 then Delete(s, i, 9); until i = 0; repeat i := Pos(', короче,', s); if i 0 then Delete(s, i, 9); until i = 0; искать «, короче,» удалить 9 символов Пример 5: обработка текстовых данных

86 Работа с двумя файлами одновременно program qq; var s: string; i: integer; fIn, fOut: text; begin assign(fIn, 'input.txt'); reset(fIn); assign(fOut, 'output.txt'); rewrite(fOut); { обработать файл } close(fIn); close(fOut); end. fIn, fOut: text; файловые переменные открыть файл для чтения открыть файл для записи

87 Полный цикл обработки файла while not eof(fIn) do begin readln(fIn, s); writeln(fOut, s); end; while not eof(fIn) do begin readln(fIn, s); writeln(fOut, s); end; repeat i := Pos(', короче,', s); if i 0 then Delete(s, i, 9); until i = 0; пока не достигнут конец файла обработка строки запись «очищенной» строки

88 Задания В файле input.txt записаны строки, сколько их – неизвестно. «5»: Заменить все слова «короче» на «в общем» и записать результат в файл output.txt. «6»: Вывести в файл output.txt только те строки, в которых больше 5 слов (слова могут быть разделены несколькими пробелами).

89 4. Типизированные файлы

90 Организация типизированного файла Типизированный файл – это файл, все компоненты которого одного типа, заданного при объявлении файловой переменной. Компоненты файла хранятся на диске во внутреннем (двоичном) формате и нумеруются с 0. Компонентами таких файлов могут быть как простые (integer, longint, real и т.д.) типы данных, так и структурированные типы данных (массивы, записи и др.)

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

92 Процедура Стандартные процедуры и функции обслуживания типизированных файлов осуществляет чтение очередных компонентов типизированного файла. Список переменных ввода содержит одну или несколько переменных того же типа, что и компоненты файла, разделенных запятыми. Если файл исчерпан, обращение к процедуре вызывает ошибку ввода-вывода. Read(Var f; с1, с2,...,сn)

93 Процедура Стандартные процедуры и функции обслуживания типизированных файлов осуществляет запись данных в типизированный файл. Список вывода содержит одно или более выражений того же типа, что и компоненты файла, разделенных запятыми. Write(Var f; с1, с2,...,сn) При работе с типизированными файлами процедура Writeln не используется. !

94 Процедура Стандартные процедуры и функции обслуживания типизированных файлов осуществляет установку указателя файла (переход) на компонент файла с номером numcomp. Seek(Var f, numcomp: word) Например, Seek(f, 9); осуществляет переход к десятой записи в файле f.

95 Функция Стандартные процедуры и функции обслуживания типизированных файлов возвращает количество компонент файла, указанного файловой переменной. Может использоваться для установки на конец файла совместно с Seek() или на последнюю запись файла соответственно: FileSize(Var f): longint Seek(f, FileSize(f)); Seek(f, FileSize(f)-1); Seek(f, FileSize(f)); Seek(f, FileSize(f)-1);

96 Функция Стандартные процедуры и функции обслуживания типизированных файлов возвращает порядковый номер компонента, который будет обрабатываться следующей операцией ввода-вывода. FilePos(Var f): longint

97 После открытия файла для чтения или записи указатель файла стоит в его начале и указывает на первый компонент, имеющий номер 0. После каждого чтения или записи указатель сдвигается к следующему компоненту файла. Поскольку длина каждой компоненты файла строго постоянна, помимо последовательного возможно осуществление прямого доступа к компонентам файла. По той же причине, если требуется изменить компонент файла, то не обязательно переписывать компоненты в другой файл, а достаточно установить указатель файла на изменяемый компонент и записать новый компонент на место старого. Удаление компонент обычно требует перезаписи файла. Обработка типизированного файла

98 Добавление компонентов в конец файла выполняется в режиме чтения. Для этого указатель файла устанавливается на его конец (как показано выше), после чего все выводимые компоненты дописываются в конец файла. Добавление компонентов в середину или начало файла может выполняться следующим образом: определяем место, в которое должны быть добавлены элементы, все последующие компоненты переписываем во временный файл, вставляем новые компоненты дописываем в файл компоненты, переписанные во временный файл. Обработка типизированного файла

99 Разработать программу, создающую файл, компонентами которого являются символы, введенные с клавиатуры. Затем эта программа должна изменять символы, записанные в файл, организовывать чтение символов из файла попеременно с начала и с конца (прямой доступ), находить указанный символ в файле и удалять его из файла. Пример 6

100 Пример 6 Program ex; Var f, f1: file of char; { две файловые переменные} ch, i: char; j: longint; name: strmg[8]; Begin WriteLn('Введите имя файла:'); ReadLn(name); {создание и открытие файла} Assign(f, name + 'dat'); {связываем файл с файловой переменной} ReWrite(f); {открываем файл для записи (создаем)} WriteLn('Вводите символы или CTRL-Z:'); Program ex; Var f, f1: file of char; { две файловые переменные} ch, i: char; j: longint; name: strmg[8]; Begin WriteLn('Введите имя файла:'); ReadLn(name); {создание и открытие файла} Assign(f, name + 'dat'); {связываем файл с файловой переменной} ReWrite(f); {открываем файл для записи (создаем)} WriteLn('Вводите символы или CTRL-Z:');

101 Пример 6 {занесение записей в файл} while not EOF do {пока не введено CTRL-Z с клавиатуры} begin ReadLn(ch); {вводим символ с клавиатуры} Write(f, Ch); {записываем символ в файл} end; WriteLn; {последовательное чтение записей из файла} ReSet(f); {открываем файл для чтения} while not EOF(f) do {пока не достигнут конец файла} begin Read(f, ch); {читаем символ из файла} Write(ch, ' '); {выводим символ на экран} end; WriteLn; {занесение записей в файл} while not EOF do {пока не введено CTRL-Z с клавиатуры} begin ReadLn(ch); {вводим символ с клавиатуры} Write(f, Ch); {записываем символ в файл} end; WriteLn; {последовательное чтение записей из файла} ReSet(f); {открываем файл для чтения} while not EOF(f) do {пока не достигнут конец файла} begin Read(f, ch); {читаем символ из файла} Write(ch, ' '); {выводим символ на экран} end; WriteLn;

102 Пример 6 {изменение записей в файле} ReSet(f); {открываем файл для чтения} while not EOF(f) do {пока не достигнут конец файла} begin Read(f, i); {читаем символ из файла} Write(i, ' '); {выводим символ на экран} i:=chr(ord(i)+10); {изменяем символ} WriteLn(i); {выводим на экран измененный символ} Seek(f,FilePos(f)-1); {возвращаемся на 1 компонент} Write(f, i); {перезаписываем символ} end; WriteLn; {изменение записей в файле} ReSet(f); {открываем файл для чтения} while not EOF(f) do {пока не достигнут конец файла} begin Read(f, i); {читаем символ из файла} Write(i, ' '); {выводим символ на экран} i:=chr(ord(i)+10); {изменяем символ} WriteLn(i); {выводим на экран измененный символ} Seek(f,FilePos(f)-1); {возвращаемся на 1 компонент} Write(f, i); {перезаписываем символ} end; WriteLn;

103 Пример 6 {попеременное чтение записей с начала и конца файла} ReSet(f); {открываем файл для чтения} j:=0; {устанавливаем номер компонента равным 0} while not EOF(f) do {пока не достигнут конец файла} begin Read(f, i); {читаем символ из начала файла} Write(i); {выводим символ на экран} Seek(f, FileSize(f) - FilePos(f)); {устанавливаем указатель для чтения из конца файла} Read(f, i); {читаем символ из конца файла} Write(i); {выводим символ на экран} j:=j+l; {увеличиваем номер компонента} Seek(f, j); {устанавливаем указатель на следующий от начала компонент} end; WriteLn; WriteLn (Введите символ для удаления:); ReadLn(ch); {попеременное чтение записей с начала и конца файла} ReSet(f); {открываем файл для чтения} j:=0; {устанавливаем номер компонента равным 0} while not EOF(f) do {пока не достигнут конец файла} begin Read(f, i); {читаем символ из начала файла} Write(i); {выводим символ на экран} Seek(f, FileSize(f) - FilePos(f)); {устанавливаем указатель для чтения из конца файла} Read(f, i); {читаем символ из конца файла} Write(i); {выводим символ на экран} j:=j+l; {увеличиваем номер компонента} Seek(f, j); {устанавливаем указатель на следующий от начала компонент} end; WriteLn; WriteLn (Введите символ для удаления:); ReadLn(ch);

104 Пример 6 {подготовка к удалению записей: переименование исходного файла и открытие нового файла с тем же именем} Close(f); {закрываем файл} ReName(f, name + 'bak'); {переименовываем файл} ReSet(f); {открываем файл для чтения} Assign(f1, name + 'dat'); {связываем новый файл с переменной} ReWrite(f1); {открываем новый файл для записи} {удаление записей - перепись остающихся записей в др. файл} while not EOF(f) do begin Read(f, i); {читаем символ из файла} if ich then Write(f1, i); {если символ не подлежит удалению, то записываем его в новый файл} end; Erase(f); {удаляем старый файл, после закрытия в нем ничего не изменилось, поэтому повторно его можно не закрывать} {подготовка к удалению записей: переименование исходного файла и открытие нового файла с тем же именем} Close(f); {закрываем файл} ReName(f, name + 'bak'); {переименовываем файл} ReSet(f); {открываем файл для чтения} Assign(f1, name + 'dat'); {связываем новый файл с переменной} ReWrite(f1); {открываем новый файл для записи} {удаление записей - перепись остающихся записей в др. файл} while not EOF(f) do begin Read(f, i); {читаем символ из файла} if ich then Write(f1, i); {если символ не подлежит удалению, то записываем его в новый файл} end; Erase(f); {удаляем старый файл, после закрытия в нем ничего не изменилось, поэтому повторно его можно не закрывать}

105 Пример 6 {последовательное чтение записей из нового файла} ReSet(f1); {открываем новый файл для чтения} while not EOF(f1) do begin Read(f1, Ch); {читаем из файла} Write(ch, ' '); end; WriteLn; End. {последовательное чтение записей из нового файла} ReSet(f1); {открываем новый файл для чтения} while not EOF(f1) do begin Read(f1, Ch); {читаем из файла} Write(ch, ' '); end; WriteLn; End.

106 Разработать программу, которая создает файл, содержащий список фамилий и даты рождения. Осуществить поиск в этом файле даты рождения по заданной фамилии. Пример 7

107 Пример 7 Program ex; Type fam=record {тип запись «сведения о сотрудниках»} ff: string[20]; {фамилия} year: word; {год рождения} month: 1..12; {месяц рождения} day: {день рождения} end; Var f: file of fam; {файловая переменная «файл сотрудников»} fb: fam; n, i: integer; fff: string; key: boolean; Begin Assign(f, 'a.dat'); ReWrite(f); {открываем файл для записи} WriteLn('Введите данные или CTRL-Z'); Program ex; Type fam=record {тип запись «сведения о сотрудниках»} ff: string[20]; {фамилия} year: word; {год рождения} month: 1..12; {месяц рождения} day: {день рождения} end; Var f: file of fam; {файловая переменная «файл сотрудников»} fb: fam; n, i: integer; fff: string; key: boolean; Begin Assign(f, 'a.dat'); ReWrite(f); {открываем файл для записи} WriteLn('Введите данные или CTRL-Z');

108 Пример 7 while not EOF do begin {цикл, пока не введено CTRL-Z} ReadLn(fb.ff, fb.year, fb.month, fb.day); {вводим данные по полям, фамилию вводим в отдельной строке, т.к. ввод строки завершается нажатием клавиши Enter} Write(f, fb); {запись в файл как один компонент} end; Close(f); {закрываем файл} WriteLn('Введите фамилию'); Readln(fff); key:=false; {устанавливаем признак «запись не найдена»} ReSet(f); {открываем файл для чтения} while not EOF do begin {цикл, пока не введено CTRL-Z} ReadLn(fb.ff, fb.year, fb.month, fb.day); {вводим данные по полям, фамилию вводим в отдельной строке, т.к. ввод строки завершается нажатием клавиши Enter} Write(f, fb); {запись в файл как один компонент} end; Close(f); {закрываем файл} WriteLn('Введите фамилию'); Readln(fff); key:=false; {устанавливаем признак «запись не найдена»} ReSet(f); {открываем файл для чтения}

109 Пример 7 while (not EOF(f)) and (not key) do begin {пока не обнаружен конец файла и не найдена запись} Read(f, fb); {читаем запись из файла} if fb.ff=fff then begin {если фамилии совпадают, то выводим данные} WriteLn('Дaтa:', fb.year, fb.month:3, fb.day:3); key:=true; {устанавливаем признак «запись найдена»} end; if not key then {если признак не установлен} WriteLn('Hem данных') ; Close(f); {закрываем файл} End. while (not EOF(f)) and (not key) do begin {пока не обнаружен конец файла и не найдена запись} Read(f, fb); {читаем запись из файла} if fb.ff=fff then begin {если фамилии совпадают, то выводим данные} WriteLn('Дaтa:', fb.year, fb.month:3, fb.day:3); key:=true; {устанавливаем признак «запись найдена»} end; if not key then {если признак не установлен} WriteLn('Hem данных') ; Close(f); {закрываем файл} End.

110 Пример 8 program Audioln; Type {Структура для хранения данных об одной дорожке} Track = record Name: string[50]; {Название дорожки} Hours: 0..3; {Часы} Minutes: 0..59; {Минуты} Seconds: 0..59; {Секунды} end; program Audioln; Type {Структура для хранения данных об одной дорожке} Track = record Name: string[50]; {Название дорожки} Hours: 0..3; {Часы} Minutes: 0..59; {Минуты} Seconds: 0..59; {Секунды} end; Разработать программу, которая выводит данные о компакт-дисках, содержащиеся в типизированном файле.

111 Пример 8 {Структура для хранения информации о диске} CD = record Author: string[20]; {Автор} Title: string[50]; {Название} Year: integer; {Год} Kind: string[10]; {Жанр} case Tracks: byte of {Количество дорожек} 1: (Track1: Track); {Если дорожек больше одной, тогда информация хранится в виде массива} [2..20]: (ATracks:array[1..20] of Track); end; Var c: char; i, j: byte; FName: string; CDData: CD; F: file of CD; isError: boolean; {Структура для хранения информации о диске} CD = record Author: string[20]; {Автор} Title: string[50]; {Название} Year: integer; {Год} Kind: string[10]; {Жанр} case Tracks: byte of {Количество дорожек} 1: (Track1: Track); {Если дорожек больше одной, тогда информация хранится в виде массива} [2..20]: (ATracks:array[1..20] of Track); end; Var c: char; i, j: byte; FName: string; CDData: CD; F: file of CD; isError: boolean;

112 Пример 8 {Процедура ввода данных об одной дорожке} procedure DataForTrack(var TrackData: Track); Var hh, mm, sa: string[2]; Timing: string[8]; begin with TrackData do begin (Преобразовываем в строки значения часов, минут и секунд) Str(Hours, hh); Str (Minutes, mm); Str(Seconds, ss) ; {Формируем строку времени звучания) if Hours = 0 then Timing := '' else Timing := hh + ':'; Timing := Timing + mm + '"' + ss + Chr(39) ; Writeln(num, '-', Name, ' (', Timing, ')'); end; {Процедура ввода данных об одной дорожке} procedure DataForTrack(var TrackData: Track); Var hh, mm, sa: string[2]; Timing: string[8]; begin with TrackData do begin (Преобразовываем в строки значения часов, минут и секунд) Str(Hours, hh); Str (Minutes, mm); Str(Seconds, ss) ; {Формируем строку времени звучания) if Hours = 0 then Timing := '' else Timing := hh + ':'; Timing := Timing + mm + '"' + ss + Chr(39) ; Writeln(num, '-', Name, ' (', Timing, ')'); end;

113 Пример 8 Begin isError := True; while isError do begin WriteLn('Введите имя файла с данными о музыкальных дисках:'); Readln (FName) ; Assign(F, FName); {$ I-} Reset(F); {$ I+} isError := (IOResult > 0); if isError then Writeln('Такого файла нет'); end; Begin isError := True; while isError do begin WriteLn('Введите имя файла с данными о музыкальных дисках:'); Readln (FName) ; Assign(F, FName); {$ I-} Reset(F); {$ I+} isError := (IOResult > 0); if isError then Writeln('Такого файла нет'); end;

114 Пример 8 repeat Writeln('Файл содержит данные о ', FileSize(F), ' дисках: '); Seek(F, 0); {Перемещаемся к первой записи} for i:=0 to FileSize(F)-1 do begin Read(F, CDData); Writeln(i+1, ' - ', CDData.Author, ', ''', CDData.Title, '''') {Отображаем список дисков по 20 на экране} if (((i+1) mod 20)=0) and (i

115 Пример 8 Writeln('Введите порядковый номер диска для просмотра: '); Readln(num); Seek(F, num-1); {Перемещаемся к указанной записи} Read(F, CDData); Writeln('>>> ', CDData.Author, ', ''', CDData.Title, '''- ', CDData.Year, 'г. (', CDData.Kind, ') ', CDData.Author, ', ''', CDData.Title, '''- ', CDData.Year, 'г. (', CDData.Kind, ')

116 Пример 8 Write('Ввести данные еще об одном диске (Да/Нет)? '); Readln(с); until с in ['N', 'n', 'Н', 'н']; Close(F); end. Write('Ввести данные еще об одном диске (Да/Нет)? '); Readln(с); until с in ['N', 'n', 'Н', 'н']; Close(F); end.

117 Следующая программа демонстрирует использование алгоритма бинарного поиска для последовательности, размещенной не в массиве, а в файле прямого доступа (типизированном файле). Разработать программу поиска заданных элементов в упорядоченном типизированном файле целых чисел. Пример 9

118 Пример 9 Uses CRT; Type Lf: file of integer var f: Lf; name: string; {Поиск элемента х в упорядоченном файле целых чисел f } function searchf (var f: Lf; x: integer): boolean; var nn, i1, i2, s, ax, bx, as: integer; Begin reset(f); nn:=FileSize(f); i1:=0; i2:=nn-1; seek(f, i1); Read(f, ax); seek(f, i2); Read(f, bx); if (x>bx) or (xbx) or (x

119 Пример 9 while (i2-i1 > 1) do begin s:=(i2-i1)div 2 + i1; seek(f, s); Read(f, as); if as=x then begin searchf :=true; Exit end; if as 1) do begin s:=(i2-i1)div 2 + i1; seek(f, s); Read(f, as); if as=x then begin searchf :=true; Exit end; if as

120 Пример 9 { Ввод искомых элементов и обращение к операции поиска } procedure elements; var x, i, n: integer; begin Writeln('Введите число искомых элементов :'); Read(n); for i:=1 to n do begin Writeln('Введите искомое значение:'); Read(x); if searchf(f, x) then WriteLn(' число есть') else WriteLn(' числа нет'); end; ReadLn end; { procedure elements } { Ввод искомых элементов и обращение к операции поиска } procedure elements; var x, i, n: integer; begin Writeln('Введите число искомых элементов :'); Read(n); for i:=1 to n do begin Writeln('Введите искомое значение:'); Read(x); if searchf(f, x) then WriteLn(' число есть') else WriteLn(' числа нет'); end; ReadLn end; { procedure elements }

121 Пример 9 { Головная программа } Begin WriteLn('Введите полное имя файла:'); ReadLn(name); assign(f, name); {$I-} {проверяем существование файла} reset(f); {$I+} if IOResult = 0 then elements else WriteLn('*** неверное имя файла'); ReadLn End. { Головная программа } Begin WriteLn('Введите полное имя файла:'); ReadLn(name); assign(f, name); {$I-} {проверяем существование файла} reset(f); {$I+} if IOResult = 0 then elements else WriteLn('*** неверное имя файла'); ReadLn End.

122 Следует отметить, что любой текстовый файл может быть прочитан как типизированный файл с компонентами типа CHAR. В этом случае необходимо учитывать, что маркер конца строки текстового файла рассматривается в символьном представлении как последовательность из двух символов #13 и #10. Разработать программу, которая открывает текстовый файл как типизированный с компонентом типа CHAR и читает его по символу. Пример 10

123 Пример 10 Program chartextfile; Type ff=file of char; {новый тип - символьный файл} Var f: ff; {файловая переменная типа файл символов} a: char; n, i: integer; fname, st: string[30]; Begin WriteLn('Bвeдитe имя файла'); ReadLn(fname); Assign(f, fname); ReSet(f); {открыть текстовый файл как типизированный на чтение} Program chartextfile; Type ff=file of char; {новый тип - символьный файл} Var f: ff; {файловая переменная типа файл символов} a: char; n, i: integer; fname, st: string[30]; Begin WriteLn('Bвeдитe имя файла'); ReadLn(fname); Assign(f, fname); ReSet(f); {открыть текстовый файл как типизированный на чтение}

124 Пример 10 while not EOF(f) do begin St:=''; Read(f, a); {читаем символ} while (а#13) and not EOF(f) do begin {до маркера конца строки или конца файла} st:=st+a; {добавляем считанный символ в строку} Read(f, a); {читаем очередной символ} end; if not EOF(f) then Read(f, a); {пропускаем символ #10} WriteLn(st); {выводим сформированную строку} end; Close(f); End. while not EOF(f) do begin St:=''; Read(f, a); {читаем символ} while (а#13) and not EOF(f) do begin {до маркера конца строки или конца файла} st:=st+a; {добавляем считанный символ в строку} Read(f, a); {читаем очередной символ} end; if not EOF(f) then Read(f, a); {пропускаем символ #10} WriteLn(st); {выводим сформированную строку} end; Close(f); End.

Контрольные вопросы 1.Назовите основные типы файлов? 2.Какой смысл имеет файловая переменная? 3.Верно ли, что элементы файла должны быть одного типа и что файл отличается от массива только тем, что размер (количество элементов) файла произволен, а размер массива фиксирован? 4.Можно ли, считав из файла пятый элемент, затем сразу считать второй элемент? А как можно? 5.Верно ли, что в одно и тоже время нельзя считывать из файла и записывать в него? 6.Можно ли сравнивать файлы или присваивать один файл другому?

Контрольные вопросы 7.Эквивалентны ли файлы типа text и file of char? 8.Кроме текстовых файлов, файлы каких еще типов могут делиться на строки? Обязательно ли все строки файла должны быть одинаковой длины? 9.Если при записи в t:text надо закончить строку, то как это сделать? 10.Сколько можно держать одновременно открытыми файлов? 11.Можно ли описать следующий тип type f = file of file?