Слайд 2Общие сведения о файлах и файловой системе
Файлы языка Паскаль
Текстовые файлы
Типизированные
файлы
Примеры решения задач обработки файлов
Содержание
Слайд 31. Общие сведения о файлах и файловой системе
Слайд 4Файлом называют именованную последовательность элементов данных (компонент файла), расположенных, как
правило, во внешней памяти:
на дискетах,
винчестере,
CD или других устройствах
хранения информации,
также устройствах ввода-вывода.
В файле может храниться текст, программа, числовые данные, графическое изображение и т.д.
Для организации работы с файлами программа на языке Паскаль взаимодействует с операционной системой.
Определение
Слайд 5Файл – набор данных на диске, имеющий имя.
Имя файла:
255 символов, нельзя \ / : * ? ”
> |
персональное имя
расширение
(«фамилия»)
Слайд 6Для того чтобы операционная система (ОС) могла размещать файлы на
дисках, последние должны быть специальным образом размечены (форматированы). Разметка осуществляется
средствами используемой ОС.
Как правило, диски хранят большое количество файлов (количество их на жестких дисках обычно исчисляется тысячами). Для удобства и ускорения работы с таким количеством файлов применяется та или иная файловая система.
Слайд 7Файловая система
одноуровневая
vasya.txt 360 байт
12.03.2007 25
Примеры.doc
13 Кб 25.04.2007 230
Я.bmp 1,28 Мб 13.09.2006 1235
номер начального блока (кластера) на диске
размер
дата изменения
самый простой вариант
все файлы «в куче», сложно разбираться
ограниченный объем каталога (512 записей)
Файловая система – это порядок размещения файлов на диске.
Слайд 8Файловая система
многоуровневая (дерево)
Диск C:
autoexec.bat
Документы
План.doc
Отчет.doc
Фото
Видео
Кузя.avi
Винни-Пух.wmv
2006
Я.jpg
Шарик.jpg
2007
Ку.jpg
Зя.jpg
Корневой каталог
– главный каталог диска.
Вложенная папка (подкаталог) – это папка, расположенная внутри другой папки.
Папка (каталог) – объединяет файлы и вложенные папки
файлы
файлы
Файлы в корневом каталоге
папка
Слайд 9Файловая система
многоуровневая (дерево)
Рабочая папка (текущий каталог) – папка, с которой
в данный момент работает пользователь.
Слайд 10Адреса файлов
C:\Фото\2007\Ку.jpg
диск
папки
имя файла
\\SERVER\Видео\2007\Зя.avi
имя компьютера
C:\SERVER\Видео\2007\Зя.avi
A:\autoexec.bat
\\work3\Игры\Hover\hover.exe
D:\Windows\Temp\Справка.txt
E:\Реферат.doc
Сетевой адрес:
Примеры:
Полный адрес файла = путь +
имя файла
Путь к файлу – это перечисление папок (каталогов),
в которых он находится, сверху вниз (начиная с диска).
Слайд 11Маски
Маска – это обозначение для группы файлов.
* – любое количество
любых символов
? – один любой символ
Примеры:
*.*
*.doc
все файлы
все файлы с расширением
.doc
a*.?
имя файла начинается с «a», расширение из
1 символа
*x*.??*
имя файла содержит «x», расширение не менее
2 символов
*z.a?
имя файла заканчивается на «z», расширение начинается «a», всего 2 символа
Слайд 12Папки Windows
сетевые ресурсы
сетевой диск
флэш-диск
CD (DVD)
Слайд 13Логические диски в Windows
A:, B: дискеты
C: винчестер, загрузочный диск
D: …
Z: винчестер, CD, DVD, флэш-диск,
сетевой диск (X: \\SERVER\Игры)
дисковод
Слайд 15В Паскале файл определяется как последовательность компонентов, относящихся к одному
типу:
файл записей,
файл целых чисел,
файл строк
и т.
п.
Особенностью файлов по сравнению с другими структурными типами данных является то, что в любой момент доступен только один компонент.
Количество компонентов файла заранее не определяется.
Максимальный размер файла, размещенного во внешней памяти, ограничивается лишь техническими возможностями вычислительной системы.
Слайд 16Файлы полезны, если объем входных данных превосходит посильный при ручном
вводе. (Крайним является случай, когда входные или выходные данные заведомо
не могут поместиться в оперативной памяти.)
Файлы нужны, если приходится многократно вводить одну и ту же информацию, с минимальными изменениями или вовсе без изменений (например, при отладке программы).
Файлы необходимы, если нужно сохранять информацию о результатах работы программы, полученных при вводе различных входных данных (то есть: при поиске ошибок в программе).
Когда нужно использовать файлы
Слайд 17Разновидности файлов
Файлы
только текст без оформления,
не содержат управляющих символов (с кодами
< 32)
ACSII (1 байт на символ)
UNICODE (2 байта на символ)
*.txt,
*.log,
*.htm, *.html
могут содержать любые символы кодовой таблицы
*.doc, *.exe,
*.bmp, *.jpg,
*.wav, *.mp3,
*.avi, *.mpg
Текстовые
Бинарные
Папки
(каталоги)
возможно создавать, просматривать и редактировать "вручную" - в любом текстовом редакторе; при считывании данных не требуется заботиться об преобразовании
информация записывается по байтам и потому не доступна для просмотра или редактирования в удобных для человека текстовых редакторах; зато такие файлы более компактны, чем текстовые
Слайд 18Бинарные файлы бывают двух видов
типизированные,
нетипизированные.
К типизированным относятся файлы, содержащие
данные строго определенного типа. Обычно такие файлы представляются собой наборы
записей.
К нетипизированным относятся двоичные файлы, которые могут содержать любые совокупности байтов данных без привязки к какому-нибудь одному типу.
Разновидности файлов
Слайд 19Логические устройства используют для организации обмена информацией с основными устройствами
ввода-вывода, такими как дисплей, клавиатура и т.п.
Логические устройства имеют
стандартные имена, например:
CON – консоль: при выводе данных соответствует экрану, при вводе – клавиатуре;
PRN – принтер;
NUL – «пустое устройство», обычно заменяет устройство вывода отладочной информации после завершения отладки программы.
Логические устройства
Слайд 20В отличие от дисковых файлов с логическими устройствами операции ввода-вывода
осуществляют только последовательно, так как
при выполнении операций вывода данные
передаются на устройство покомпонентно,
а при выполнении операций ввода – покомпонентно запрашиваются с него.
Логические устройства
Слайд 21Физически операции ввода-вывода с файлами выполняются с использованием специального буфера.
Так,
выводимые записи вначале помещаются в буфер, откуда переписываются в файл
по мере заполнения буфера, а вводимые читаются из буфера, куда они были предварительно помещены.
Использование буферов позволяет существенно повысить скорость выполнения операций ввода-вывода с файлом, так как на одну операцию ввода-вывода с дисководом, которая выполняется сравнительно медленно, обычно приходятся десятки операций чтения из буфера.
Организация файла
Слайд 22Для дисковых файлов принципиально возможны
не только последовательный,
но и произвольный
доступ, при котором чтение информации осуществляется из указанного места.
Организация файла
Слайд 23Доступ к компоненту файла осуществляется через указатель файла.
При выполнении операции
чтения или записи указатель автоматически перемещается на следующий компонент:
Организация файла
Слайд 24Для идентификации файлов используют файловые переменные.
Файловая переменная не может
быть задана константой.
В зависимости от способа представления информации различают
три типа файлов, соответственно различаются и способы описания файловых переменных
Описание файлов
Слайд 25Файловая переменная типизированного файла описывается как:
Описание типизированных файлов
Туре
переменной> = file оf ;
где - любой
тип данных, кроме файлового.
Типизированные файлы используют, когда обрабатывают хранящуюся в файле последовательность компонентов одинаковой длины (чисел, записей и т.п.).
Слайд 26Файловая переменная текстового файла описывается как:
Описание текстовых файлов
Туре
переменной> = text;
Текстовые файлы используют для работы с текстами, представленными
в виде строк переменной длины.
Слайд 27Файловая переменная нетипизированного файла описывается как:
Описание нетипизированных файлов
Туре
переменной> = file;
Нетипизированные файлы применяют для организации скоростного обмена между
внешней и оперативной памятью физическими записями указанной длины без преобразования и обработки.
Слайд 28Как и любая переменная языка Паскаль, файловая переменная может быть
описана в инструкции объявления переменных.
Например:
Описание файлов
Var F1: file of
real;
F2:file;
F3: text;
или с предварительным объявлением типа:
Туре FF = file of integer;
Var F1: FF;
Слайд 29При необходимости файловую переменную допускается передавать в подпрограмму через параметры.
Однако следует помнить, что с этой целью можно использовать только
параметры-переменные.
Например:
Описание файлов
Туре FF = file of integer;
Procedure Print (Var F1:FF);
Слайд 30Работа с файлом включает:
инициализацию файловой переменной – установление связи файловой
переменной с файлом;
открытие файла – подготовку файла для выполнения операций
ввода/вывода;
обработку компонентов файла – выполнение операций ввода-вывода;
закрытие файла (при повторном открытии файл закрывается автоматически).
Слайд 31Связь между физическим устройством (дисководом или внешним устройством) и файловой
переменной устанавливается специальной процедурой.
Процедура
Инициализация файловой переменной
инициализирует файловую переменную f,
связывая ее с файлом или логическим устройством, определенным строкой st.
Если файл находится в текущем каталоге, то достаточно указать имя файла и его расширение. В противном случае необходимо указать полное имя файла
Assign (Var f; st:string)
Слайд 32Например:
Инициализация файловой переменной
Туре F = text;
Var f1, f2, f3: F;
...
Assign
(fl, 'T1.dat'); {связывание файловой переменной с файлом в
текущем каталоге}
Assign (f2, 'd:\iva\a.dat'): {связывание файловой переменной с файлом в указанном каталоге}
Assign(f3, 'CON'); {связывание файловой переменной с консолью}
Слайд 33Открытие файла предполагает указание направления передачи данных. В Паскале файл
можно открыть
для чтения
и для записи.
Текстовый файл можно открыть
также для добавления строк.
В типизированный файл, открытый для чтения, можно дописывать новые записи или писать в нем новые записи на место старых.
Открытие файла
Слайд 34Процедура
Открытие файла
открывает файл, определенный файловой переменной f для чтения.
При
выполнении этой процедуры указатель файла устанавливается на первый компонент файла
(физически первый блок записей считывается в буфер).
Логическое устройство в этом случае готовится к выполнению операций ввода.
ReSet(Var f)
Слайд 35© С.В.Кухта, 2009
При открытии для чтения несуществующего файла регистрируется ошибка
выполнения, а функция 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('Файл существует');
Слайд 36Процедура
Открытие файла
открывает файл, определенный файловой переменной f, для записи.
При
открытии для записи существующего файла старый файл уничтожается без предварительной
проверки и выдачи предупреждения пользователю.
Если файла с таким именем не существовало, то он создается и подготавливается к записи (физически – очищается буфер).
Логическое устройство при этом подготавливается к приему информации.
ReWrite(Var f)
Слайд 37Процедура
Открытие файла
открывает текстовый файл, определенный файловой переменной f, для добавления
строк.
При открытии для добавления строк указатель файла устанавливается на конец
файла, и, соответственно, все строки, выводимые в файл, дописываются к уже существующему файлу.
AppEnd(Var f: text)
Слайд 38Любой программе без объявления, инициализации файловой переменной и открытия доступны
два файла со стандартными файловыми переменными:
INPUT – чтение со стандартного
устройства ввода;
OUTPUT – вывод на стандартное устройство вывода.
Это текстовые файлы, используемые для выполнения элементарных операций ввода-вывода.
В операторах ввода-вывода файловые переменные этих файлов обычно не указывают. Остальные файлы становятся доступными только после связывания файловой переменной с файлом или логическим устройством и открытия файла.
Стандартным устройством ввода по умолчанию является клавиатура.
Стандартным устройством вывода – экран дисплея.
Открытие файла
Слайд 39На базе этих операций выполняют более сложные операции:
создание файла –
занесение в файл требуемых записей;
модификация файла – изменение всех или
нескольких записей, добавление и удаление записей;
поиск нужной информации в файле.
Выполнение этих операций осуществляется по-своему для каждого типа файла (см. параграфы далее).
Обработка компонентов файла
Слайд 40Закрытие файла, открытого для записи или чтения, осуществляется процедурой
Закрытие файла
Close(Var
f)
При этом вновь созданный файл регистрируется в каталоге.
!
Поскольку любое
обращение к диску осуществляется через буферную память, часть данных, выводимых в файл, может остаться в буфере. Процедура закрытия файла обеспечивает вывод оставшихся компонентов из буфера в файл.
Связь файловой переменной с файлом при закрытии сохраняется, и при повторном использовании этого же файла процедуру Assign применять еще раз не требуется.
Слайд 41Принцип сэндвича
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 переходом на нов.строку }
Слайд 42Работа с файлами
Особенности:
имя файла упоминается только в команде assign, обращение
к файлу идет через файловую переменную
файл, который открывается на чтение,
должен существовать
если файл, который открывается на запись, существует, старое содержимое уничтожается
данные записываются в файл в текстовом виде
при завершении программы все файлы закрываются автоматически
после закрытия файла переменную f можно использовать еще раз для работы с другим файлом
Слайд 43Для взаимодействия с файловой системой определены стандартные процедуры и функции,
которые применимы к файлам любых типов.
Стандартные процедуры и функции обслуживания
файлов
Слайд 44Процедура
Стандартные процедуры и функции обслуживания файлов
осуществляет переименование файла, определенного файловой
переменной f. Новое имя файла задается параметром name.
Если в
процессе работы программы требуется переименовать файл, открытый для чтения или записи, необходимо предварительно закрыть этот файл.
При совпадении нового имени файла с каким-либо уже существующим выдается сообщение об ошибке.
ReName(Var f; name: string)
Слайд 45Процедура
Стандартные процедуры и функции обслуживания файлов
осуществляет удаление созданного или находящегося
в процессе формирования файла.
Перед уничтожением файл должен быть закрыт,
так как разрешается удалять только закрытые файлы.
Erase(Var f)
Слайд 46Функция
Стандартные процедуры и функции обслуживания файлов
определяет конец файла.
Как было
отмечено выше, размер файла при его создании не фиксируется. Поэтому
в процессе работы требуется проверка достижения конца файла.
Функция принимает значение TRUE, если указатель стоит в конце файла (после последней записи). При этом, если производится чтение, то это означает, что файл исчерпан, а если идет запись, то новая запись дописывается в конец файла.
Функция принимает значение FALSE, если конец файла еще не достигнут.
EOF(Var f):boolean
Слайд 47Функция
Стандартные процедуры и функции обслуживания файлов
возвращает код правильности выполнения операций
ввода/вывода.
Если ошибок не зафиксировано, то функция возвращает 0.
Информация
об ошибках может быть получена и обработана в режиме компилятора {$ I-} – отключение контроля ошибок ввода/вывода.
IOResult(Var f): word
Слайд 48Процедура
Стандартные процедуры и функции обслуживания файлов
обрезает файл, оставляя компоненты до
того, на который ссылается указатель файла (кроме текстовых файлов).
Truncate(Var f)
Слайд 49Процедура
Стандартные процедуры и функции обслуживания файлов
изменяет текущий каталог: назначает текущим
каталог, указанный параметром path.
ChDir(path: string)
Слайд 50Процедура
Стандартные процедуры и функции обслуживания файлов
возвращает в переменную dir имя
текущего каталога на указанном устройстве, где устройство drive:
0 –
устройство по умолчанию;
1 – диск А;
2 – диск В и т.д.
GetDir(drive: word; Var dir: string)
Слайд 51Процедура
Стандартные процедуры и функции обслуживания файлов
создает новый каталог.
Строка dir
определяет путь и новое имя.
MkDir(dir: string)
Слайд 52Процедура
Стандартные процедуры и функции обслуживания файлов
удаляет каталог с именем, указанным
в переменной dir.
Каталог должен быть пустым.
RmDir(dir: string)
Слайд 54Текстовый файл - это файл, компонентами которого являются символьные строки
переменной длины, заканчивающиеся специальным маркером конца строки:
Структура текстового файла
Маркер конца
строки - это последовательность из двух специальных символов по таблице ASCII «#13, #10». Символ с кодом 13 интерпретируется в компьютере как команда установки курсора в начало строки, а символ с кодом 10 - как команда перехода на следующую строку. Такая комбинация кодов вводится при нажатии клавиши ENTER.
Слайд 55Текстовый файл можно открыть для записи, чтения и добавления записей
в конец.
Файл, открытый для записи, не может использоваться для
чтения и наоборот. При открытии файла для добавления система проверяет, не был ли файл открыт для чтения или записи, и если такое открытие имело место, то производится сначала закрытие файла, а затем уже открытие для добавления.
Слайд 56Текстовые файлы используют для хранения и обработки текстовой информации:
символов,
строк,
символьных массивов.
Логические и числовые данные при записи в
текстовые файлы должны преобразовываться в символьные строки.
Следует иметь в виду, что при необходимости текстовый файл может быть создан или прочитан любым текстовым редактором, в том числе и текстовым редактором.
Слайд 57Функция
Стандартные процедуры и функции обслуживания текстовых файлов
возвращает TRUE, если во
входном текстовом файле достигнут маркер конца строки.
При отсутствии файловой
переменной проверяется стандартный файл INPUT, который обычно связан с клавиатурой.
EOLn( Var f): boolean
Слайд 58Процедура
Стандартные процедуры и функции обслуживания текстовых файлов
обеспечивает ввод символов, строк
и чисел.
Список ввода представляет собой последовательность из одной или
более переменных типа CHAR, STRING, а также любого целого и вещественного типа.
При отсутствии файловой переменной ввод осуществляется из стандартного файла INPUT.
Read( Var f: text; vl, v2,..., vn)
Слайд 59Стандартные процедуры и функции обслуживания текстовых файлов
При вводе значений переменных
типа CHAR выполняется чтение одного символа из файла, считанное значение
присваивается очередной переменной из списка ввода. Символы вводятся подряд, а не через пробел, как числа.
Если перед выполнением чтения указатель файла
достиг конца очередной строки, то результатом чтения будет символ #13,
а если был достигнут конец файла, то – символ #26.
Слайд 60Стандартные процедуры и функции обслуживания текстовых файлов: Read
При вводе переменных
типа STRING количество считанных процедурой и помещенных в строку символов
равно максимальной длине строки, если раньше не встретились маркеры конца строки или конца файла, которые в строку не включаются.
Символы, выходящие за размер максимальной длины строки, отбрасываются.
Слайд 61При вводе числовых данных процедура Read пропускает все пробелы, знаки
табуляции и маркеры до первого значащего символа и читает строку
до пробела, знака табуляции или маркера.
Полученная подстрока преобразуется из символьного во внутреннее представление в соответствии с типом значения и присваивается следующей переменной из списка.
Если нарушен формат, то фиксируется ошибка ввода-вывода.
Если достигнут маркер конца файла, то переменной присваивается значение 0, причем никаких сообщений в этом случае не выдается.
Стандартные процедуры и функции обслуживания текстовых файлов: Read
Слайд 62Ввод логических констант процедурами Read и ReadLn не предусмотрен.
Чтение с
клавиатуры осуществляется через буфер, который передается процедуре при нажатии клавиши
ENTER и имеет размер 127 байт, поэтому ввести с клавиатуры строку большего размера нельзя.
Стандартные процедуры и функции обслуживания текстовых файлов: Read
Слайд 63Процедура
Стандартные процедуры и функции обслуживания текстовых файлов
также обеспечивает ввод символов,
строк и чисел.
Процедура использует те же правила ввода, что и
процедура Read, но после чтения последней переменной оставшаяся часть строки до маркера конца строки пропускается, так что следующее обращение к ReadLn или Read начнется с первого символа новой строки.
Процедура может быть вызвана без указания списка ввода, что приведет к пропуску всех символов текущей строки до маркера конца строки.
ReadLn( Var f; vl, v2,..., vn)
Слайд 64Процедуры Read и ReadLn могут использоваться без указания файловой переменной.
Тогда операция чтения осуществляется из стандартного файла INPUT.
Использование процедуры
ReadLn без параметров после процедуры Read приведет к очистке буфера ввода.
Применение этой же процедуры без предшествующей ей процедуры Read переводит программу в состояние ввода, т.е. выполнение программы приостанавливается до нажатия клавиши ENTER, что может использоваться для организации паузы на время просмотра содержимого экрана.
Стандартные процедуры и функции обслуживания текстовых файлов
Слайд 65Последовательный доступ
при открытии файла курсор устанавливается в начало
чтение выполняется с
той позиции, где стоит курсор
после чтения курсор сдвигается на первый
непрочитанный символ
12 5 45 67 56●
конец файла
(end of file, EOF)
12 5 45 67 56●
assign ( f, 'qq.txt' );
reset ( f );
read ( f, x );
Слайд 66чтение до конца строки
как вернуться назад?
Последовательный доступ
close ( f );
reset ( f ); { начать с начала }
readln
( f, x );
12 5 45¤ 36 67¤ 56●
конец строки
(end of line, EOL)
Слайд 67Процедура
Стандартные процедуры и функции обслуживания текстовых файлов
обеспечивает вывод данных в
текстовый файл или передачу их на логическое устройство.
Список вывода
– последовательность из одного или более выражений типа CHAR, STRING, BOOLEAN, а также целого или вещественного типов.
При выводе числовых значений последние преобразуются в символьное представление.
При отсутствии файловой переменной вывод осуществляется в стандартный файл OUTPUT, который обычно назначен на экран.
Write( Var f; vl, v2,..., vn)
Слайд 68Любой параметр из списка вывода может иметь формат:
Стандартные процедуры и
функции обслуживания текстовых файлов
где и интерпретируются в соответствии
с правилами, описанными в параграфе «Ввод-вывод данных» Темы 2
<параметр> [: <целое1> [: < целое2> ]],
Слайд 69Процедура
Стандартные процедуры и функции обслуживания текстовых файлов
обеспечивает вывод информации в
текстовый файл или ее передачу на логическое устройство вывода.
При отсутствии
файловой переменной вывод осуществляется в стандартный файл OUTPUT, который обычно связан с дисплеем.
Процедура полностью идентична процедуре Write, за исключением того, что выводимая строка символов завершается символами #13 и #10.
При вызове WriteLn допускается опускать список вывода, в этом случае в файл передается маркер конца строки (при выводе на экран это приведет к переводу курсора в начало следующей строки).
WriteLn( Var f; vl, v2,..., vn)
Слайд 70Функция
Стандартные процедуры и функции обслуживания текстовых файлов
пропускает все пробелы и
знаки табуляции до маркера конца строки или до первого значащего
символа и возвращает TRUE при обнаружении маркера.
Если файловая переменная не указана, то функция проверяет стандартный файл INPUT.
SeekEOLn( Var f ):boolean
Слайд 71Функция
Стандартные процедуры и функции обслуживания текстовых файлов
пропускает все пробелы, знаки
табуляции и маркеры конца строки до маркера конца файла или
до первого значащего символа и возвращает TRUE при обнаружении маркера.
Если файловая переменная отсутствует, то функция проверяет стандартный файл INPUT.
SeekEOF( Var f ):boolean
Слайд 72Разработать программу, которая формирует текстовый файл из 26 строк, содержащих
случайное количество соответствующих прописных букв латинского алфавита.
Например:
ААААА
ВВВВВ
С
DDDDDDDDDDDDDDDDDDDDD
ЕЕЕЕЕЕЕЕЕЕЕЕЕЕ
и т.д.
Пример 1
Слайд 73Пример 1
Program FormTextFile;
Var f:text; {файловая переменная для текстового
файла}
а:char; n,i:integer;
fname,st:string[30];
Begin
WriteLn('Введите имя файла');
ReadLn(fname);
Assign(f,
fname); {инициализируем файловую переменную}
ReWrite(f); {открываем файл для записи}
Randomize; {инициализируем датчик случайных чисел}
Слайд 74Пример 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.
Слайд 75Поскольку компоненты текстового файла могут иметь различную длину, возможна только
последовательная их обработка (запись, чтение и поиск).
Любой вид модификации
файла, кроме добавления записей в конец, выполняется с перезаписью информации в другой файл.
Так, для того чтобы исключить некоторую запись, необходимо переписать все строки, кроме подлежащей исключению, в другой текстовый файл. При этом обычно старый файл удаляют, новый – переименовывают, присваивая ему имя исходного файла, и файловую переменную связывают с измененным файлом.
Слайд 76Разработать программу, которая удаляет из текстового файла «пустые» строки:
строки,
не содержащие символов,
и строки, содержащие только пробелы и знаки
табуляции.
Поскольку в результате обработки часть строк текстового файла будет удалена, нам потребуется создать специальный файл, куда будут помещены непустые строки файла.
Пример 2
Слайд 77Пример 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); {открываем новый файл для записи}
Слайд 78Пример 2
while not EOF(f1) do begin
{пока не достигнут конец
файла}
if SeekEOLn(f1) then ReadLn(f1, St) {если строка пустая, то
пропускаем ее}
else begin
ReadLn(f1, st); {читаем строку}
WriteLn(f2, st);{записываем ее в новый файл}
end;
end;
Close(f1); {закрываем старый файл}
Close(f2); {закрываем новый файл}
Erase(f1); {удаляем старый файл}
ReName(f2, name); {переименовываем новый файл}
end
else
WnteLn('Файл с таким именем не найден');
End.
Слайд 79
Пример 3
Задача: в файле input.txt записаны числа (в столбик), сколько
их – неизвестно. Записать в файл output.txt их сумму.
Алгоритм:
Открыть файл
input.txt для чтения.
S := 0;
Если чисел не осталось, перейти к шагу 7.
Прочитать очередное число в переменную x.
S := S + x;
Перейти к шагу 3.
Закрыть файл input.txt.
Открыть файл output.txt для записи.
Записать в файл значение S.
Закрыть файл output.txt.
цикл с условием
«пока есть данные»
Слайд 80Пример 3
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;
f: text;
eof(f)
логическая функция, возвращает True, если достигнут конец файла
assign(f, 'output.txt');
rewrite(f);
writeln(f, 'Сумма чисел ', s);
close(f);
запись результата в файл output.txt
Слайд 81
Задания
В файле input.txt записаны числа, сколько их – неизвестно.
«4»:
Найти среднее арифметическое всех чисел и записать его в файл
output.txt.
«5»: Найти минимальное и максимальное числа и записать их в файл output.txt.
Слайд 82Пример 4: обработка массивов
Задача: в файле input.txt записаны числа (в
столбик), сколько их – неизвестно, но не более 100. Переставить
их в порядке возрастания и записать в файл output.txt.
Проблемы:
для сортировки надо удерживать в памяти все числа сразу (массив);
сколько чисел – неизвестно.
Решение:
выделяем в памяти массив из 100 элементов;
записываем прочитанные числа в массив и считаем их в переменной N;
сортируем первые N элементов массива;
записываем их в файл.
Слайд 83Пример 4: чтение данных в массив
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;
Глобальные переменные:
Функция: ввод массива, возвращает число элементов
while (not eof(f)) and (i < 100) do begin
i := i + 1;
readln(f, A[i]);
end;
ReadArray := i;
цикл заканчивается, если достигнут конец файла или прочитали 100 чисел
Слайд 84Пример 4
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);
вывод отсортированного массива в файл
Слайд 85
Задания
В файле input.txt записаны числа (в столбик), известно, что их
не более 100.
«4»: Отсортировать массив по убыванию последней цифры
и записать его в файл output.txt.
«5»: Отсортировать массив по возрастанию суммы цифр и записать его в файл output.txt.
Слайд 86Пример 5: обработка текстовых данных
Задача: в файле input.txt записаны строки,
в которых есть слово-паразит «короче». Очистить текст от мусора и
записать в файл output.txt.
Файл input.txt :
Мама, короче, мыла, короче, раму.
Декан, короче, пропил, короче, бутан.
А роза, короче, упала на лапу, короче, Азора.
Каждый, короче, охотник желает, короче, знать, где ...
Результат - файл output.txt :
Мама мыла раму.
Декан пропил бутан.
А роза упала на лапу Азора.
Каждый охотник желает знать, где сидит фазан.
Слайд 87
Алгоритм:
Прочитать строку из файла (readln).
Удалить все сочетания ",
короче," (Pos, Delete).
Записать строку в другой файл.
Перейти к
шагу 1.
Обработка строки s:
Особенность:
надо одновременно держать открытыми два файла (один в режиме чтения, второй – в режиме записи).
пока не кончились данные
repeat
i := Pos(', короче,', s);
if i <> 0 then Delete(s, i, 9);
until i = 0;
искать «, короче,»
удалить
9 символов
Пример 5: обработка текстовых данных
Слайд 88
Работа с двумя файлами одновременно
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;
файловые переменные
открыть файл для чтения
открыть файл
для записи
Слайд 89Полный цикл обработки файла
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;
пока не достигнут конец файла
обработка строки
запись «очищенной» строки
Слайд 90
Задания
В файле input.txt записаны строки, сколько их – неизвестно.
«4»:
Заменить все слова «короче» на «в общем» и записать результат
в файл output.txt.
«5»: Вывести в файл output.txt только те строки, в которых больше 5 слов (слова могут быть разделены несколькими пробелами).
Слайд 92
Организация типизированного файла
Типизированный файл – это файл, все компоненты которого
одного типа, заданного при объявлении файловой переменной.
Компоненты файла хранятся
на диске во внутреннем (двоичном) формате и нумеруются с 0.
Компонентами таких файлов могут быть как простые (integer, longint, real и т.д.) типы данных, так и структурированные типы данных (массивы, записи и др.)
Слайд 93
Организация типизированного файла
Если посмотреть такой файл любым текстовым редактором, то
можно распознать только символьную информацию, на месте же чисел в
файле будут располагаться пробелы или символы псевдографики.
Слайд 94Процедура
Стандартные процедуры и функции обслуживания типизированных файлов
осуществляет чтение очередных компонентов
типизированного файла.
Список переменных ввода содержит одну или несколько переменных
того же типа, что и компоненты файла, разделенных запятыми.
Если файл исчерпан, обращение к процедуре вызывает ошибку ввода-вывода.
Read(Var f; с1, с2, ...,сn)
Слайд 95Процедура
Стандартные процедуры и функции обслуживания типизированных файлов
осуществляет запись данных в
типизированный файл.
Список вывода содержит одно или более выражений того
же типа, что и компоненты файла, разделенных запятыми.
Write(Var f; с1, с2, ...,сn)
Слайд 96Процедура
Стандартные процедуры и функции обслуживания типизированных файлов
осуществляет установку указателя файла
(переход) на компонент файла с номером numcomp.
Seek(Var f; numcomp: word)
Например,
Seek(f,
9);
осуществляет переход к десятой записи в файле f.
Слайд 97Функция
Стандартные процедуры и функции обслуживания типизированных файлов
возвращает количество компонент файла,
указанного файловой переменной.
Может использоваться для установки на конец файла
совместно с Seek() или на последнюю запись файла соответственно:
FileSize(Var f): longint
Seek(f, FileSize(f));
Seek(f, FileSize(f)-1);
Слайд 98Функция
Стандартные процедуры и функции обслуживания типизированных файлов
возвращает порядковый номер компонента,
который будет обрабатываться следующей операцией ввода-вывода.
FilePos(Var f): longint
Слайд 99После открытия файла для чтения или записи указатель файла стоит
в его начале и указывает на первый компонент, имеющий номер
0.
После каждого чтения или записи указатель сдвигается к следующему компоненту файла.
Поскольку длина каждой компоненты файла строго постоянна, помимо последовательного возможно осуществление прямого доступа к компонентам файла.
По той же причине, если требуется изменить компонент файла, то не обязательно переписывать компоненты в другой файл, а достаточно установить указатель файла на изменяемый компонент и записать новый компонент на место старого.
Удаление компонент обычно требует перезаписи файла.
Обработка типизированного файла
Слайд 100Добавление компонентов в конец файла выполняется в режиме чтения. Для
этого указатель файла устанавливается на его конец (как показано выше),
после чего все выводимые компоненты дописываются в конец файла.
Добавление компонентов в середину или начало файла может выполняться следующим образом:
определяем место, в которое должны быть добавлены элементы,
все последующие компоненты переписываем во временный файл,
вставляем новые компоненты
дописываем в файл компоненты, переписанные во временный файл.
Обработка типизированного файла
Слайд 101Разработать программу, создающую файл, компонентами которого являются символы, введенные с
клавиатуры. Затем эта программа должна
изменять символы, записанные в файл,
организовывать чтение символов из файла попеременно с начала и с конца (прямой доступ),
находить указанный символ в файле и удалять его из файла.
Пример 6
Слайд 102Пример 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:');
Слайд 103Пример 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;
Слайд 104Пример 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;
Слайд 105Пример 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);
Слайд 106Пример 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 i<>ch then Write(f1, i); {если символ
не подлежит удалению, то записываем его в новый файл}
end;
Erase(f); {удаляем старый файл, после закрытия в нем ничего не изменилось, поэтому повторно его можно не закрывать}
Слайд 107Пример 6
{последовательное чтение записей из нового файла}
ReSet(f1); {открываем новый
файл для чтения}
while not EOF(f1) do begin
Read(f1, Ch); {читаем
из файла}
Write(ch, ' ');
end;
WriteLn;
End.
Слайд 108Разработать программу, которая создает файл, содержащий список фамилий и даты
рождения. Осуществить поиск в этом файле даты рождения по заданной
фамилии.
Пример 7
Слайд 109Пример 7
Program ex;
Type fam=record {тип запись «сведения о сотрудниках»}
ff: string[20]; {фамилия}
year: word; {год рождения}
month: 1..12; {месяц рождения}
day: 1..31 {день рождения}
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');
Слайд 110Пример 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); {открываем файл для чтения}
Слайд 111Пример 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;
end;
if not key then {если признак не установлен}
WriteLn('Hem данных') ;
Close(f); {закрываем файл}
End.
Слайд 112Пример 8
program Audioln;
Type {Структура для хранения данных об одной дорожке}
Track = record
Name: string[50]; {Название дорожки}
Hours: 0..3; {Часы}
Minutes: 0..59;
{Минуты}
Seconds: 0..59; {Секунды}
end;
Разработать программу, которая выводит данные о компакт-дисках, содержащиеся в типизированном файле.
Слайд 113Пример 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;
Слайд 114Пример 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;
end;
Слайд 115Пример 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;
Слайд 116Пример 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<(FileSize(F)-1)) then begin
Writeln('Для промотра остальных дисков нажмите ');
Read(с);
end;
end;
Слайд 117Пример 8
Writeln('Введите порядковый номер диска для просмотра: ');
Readln(num);
Seek(F, num-1); {Перемещаемся к указанной записи}
Read(F, CDData);
Writeln('>>> ', CDData.Author, ', ''', CDData.Title, '''- ', CDData.Year, 'г. (', CDData.Kind, ') <<<');
{Выводим данные о дорожках}
if CDData.Tracks =1 then DataForTrack(CDData.Track1, 1)
else
for i:=1 to CDData.Tracks do
DataForTrack(CDData.ATracks[i], i);
Слайд 118Пример 8
Write('Ввести данные еще об одном диске (Да/Нет)?
');
Readln(с);
until с in ['N', 'n', 'Н', 'н'];
Close(F);
end.
Слайд 119Следующая программа демонстрирует использование алгоритма бинарного поиска для последовательности, размещенной
не в массиве, а в файле прямого доступа (типизированном файле).
Разработать программу поиска заданных элементов в упорядоченном типизированном файле целых чисел.
Пример 9
Слайд 120Пример 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 (x
searchf :=false; Exit end;
if (x=bx) or (x=ax) then begin
searchf :=true; Exit end;
Слайд 121Пример 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 i1:=s; ax:=as end
else begin
i2:=s; bx:=as end;
end;
searchf :=false;
end; {Function searchf)
Слайд 122Пример 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 }
Слайд 123Пример 9
{ Головная программа }
Begin
WriteLn('Введите полное имя
файла:');
ReadLn(name);
assign(f, name);
{$I-} {проверяем существование
файла}
reset(f);
{$I+}
if IOResult = 0 then elements
else WriteLn('*** неверное имя файла');
ReadLn
End.
Слайд 124Следует отметить, что любой текстовый файл может быть прочитан как
типизированный файл с компонентами типа CHAR. В этом случае необходимо
учитывать, что маркер конца строки текстового файла рассматривается в символьном представлении как последовательность из двух символов #13 и #10.
Разработать программу, которая открывает текстовый файл как типизированный с компонентом типа CHAR и читает его по символу.
Пример 10
Слайд 125Пример 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); {открыть текстовый файл
как типизированный на чтение}
Слайд 126Пример 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.