Лабораторная работа n 11.
Файлы. Работа с текстом.
Цель и задача работы: научиться работать с файлами и обрабатывать данные, находящиеся в них. Требуется написать программу, считывающую данные из текстового файла; затем данные записываются в файл прямого доступа (компоненты файла являются целого или вещественного типа (если входные данные символы, то сначала нужно перевести их в коды, а потом записать в файл)); обработать данные (использовать прямой доступ к компонентам файла) и записать результат в текстовый файл.
Теоретические положения.
Существует определенный класс задач и определенные ситуации, когда количество компонент заранее определить невозможно, оно выясняется только в процессе решения задачи, т.е. при выполнении программы. Отсюда возникает необходимость в специальном типе значений, которые представляют собой произвольные последовательности элементов одного и того же типа, причем длина этой последовательности заранее не определена. Этот тип получил название файлового. Файл можно представить как ленту, у которой есть начало, а конец не фиксирован. Элементы файла записываются на ленте друг за другом.
Формат описания:
тип-FILE = "FILE" "OF" тип.
Файл - это такое устройство, с помощью которого программа общается с внешним миром, поэтому имена таких файлов (имена переменных, связанных с файлом) вносят в список, который следует за именем программы, где указываются также стандартные имена файлов ввода/ вывода. Для связи имени файла с файловой переменной служат процедуры
RESET (для чтения из файла) и REWRITE (для записи в файл). Параметры у данных процедур одинаковы. Первый параметр обязательный и является именем файловой переменной. Второй параметр - имя внешнего файла, с которым должна быть связана переменная файлового типа. Этот параметр может быть строкой, литералом или переменной. Третий дополнительный параметр является строкой, он обеспечивает задание любых полей спецификации файла, опущенных в имени файла. Четвертый дополнительный параметр возвращает размер файла в блоках при выполнении процедуры RESET или указывает число блоков, предварительно вы- деленных файлу при выполнении процедуры REWRITE. Четвертый параметр может быть переменной целого типа, кроме того, он возвращает код состояния, равный -1, если файл не может быть открыт.
Стандартные процедуры RESET и REWRITE допускают дополнительные аргументы - ключи управления вводом/выводом, которые обеспечивают непосредственное управление интерфейсом с операционной системой. Эти ключи располагаются во втором или третьем дополнительном пара- метрах. Имя ключа может быть сокращено до двух символов. Ниже при- веден полный перечень ключей.
/BLK (BLOCKED) - записи в файле не должны пересекать границ блока на диске. Этот ключ принимается по умолчанию для файлов записей.
/SPAN, /NOSPAN (SPANNED) - записи в файле могут пересекать границу блока на диске. Ключ принимается по умолчанию для текстовых файлов.
/ALOC:N, /CL:N (ALLOCATION или CLUSTERSIZE) - параметр N определяет количество блоков, выделяемых при расширении файла. Если N>0, то выделяются смежные блоки, иначе - несмежные.
/SI:N (SIZE) - используется в процедуре REWRITE и определяет начальный обуем памяти (в блоках), выделяемых под файл. Если N>0 - выделяются смежные блоки, иначе - несмежные.
/CR (CARRIAGE CONTROL) - записи в файле при печати начинаются сим- волом перевода строки (LF) и завершаются символом возврата каретки (CR). Этот ключ принимается по умолчанию для текстовых файлов.
/NOCR (NO CARRIAGE CONTROL) - принимается по умолчанию для всех файлов кроме текстовых.
/FTN (FORTRAN CARRIAGE CONTROL) - первый символ каждой записи является символом управления кареткой и интерпретируется в соответствии с правилами, принятыми в языке Фортран.
/RO (READ-ONLY) - файл только для чтения. Принимается по умолчанию для всех файлов, открытых процедурой RESET.
/RW (READ-WRITE) - файл как для чтения, так и для записи. Принимается по умолчанию для файлов открытых процедурой REWRITE.
/SEEK (DIRECT ACCESS) - файл прямого доступа. При использовании этого ключа разрешается использовать стандартную процедуру SEEK.
/TEMP (TEMPORARY) - помечает файл, подлежащий удалению после выполнения процедуры CLOSE или после окончания работы программы. Если в процедуре REWRITE не было имени файла, то этот файл также будет помечет как временный.
/NSP (NO SUPERSEDE) - если файл открывается процедурой REWRITE и если уже существует файл с таким же именем, то будет выдано сообщение об ошибке.
/SHR (SHARE) - разрешает разделенный доступ к файлу нескольким пользователям.
Ключи, обеспечивающие доступ к внутренним средствам системы управления файлов:
/ACTL:N - N определяет количество указателей извлечений и характеристики позиционирования магнитной ленты.
/APD - указывает на то, что к существующему файлу можно добавлять записи
/EXT - указывает на то, что файл доступен для расширения
/INS - указывает на то, что процедура PUT в режиме последовательного доступа модифицирует запись без усечения файла. Если задан ключ /SEEK, то ключ /INS включается автоматически.
/WRT - определяет что файл доступен для записи.
/FIX:N - определяет файл с записями фиксированной длины (N байтов). Принимается по умолчанию если файл не текстовый.
/VAR:N - определяет файл с записями переменной длины (N максимальная длина записи в байтах). Для текстовых файлов по умолчанию принимается ключ /VAR:132.
/SQ - определяет файл с последовательными записями, номера записей недоступны для программы.
Предопределенная процедура CLOSE указывает, что файл, упомянутый в качестве параметра, больше не используется. Процедура освобождает память, выделенную под буфер, дальнейший доступ к файлу запрещается. Заметим, что файлы автоматически закрываются при завершении программы или когда они появляются в других процедурах RESET или REWRITE.
Для файлов прямого доступа используется процедура SEEK, которая обеспечивает прямой доступ к компонентам файла. Она имеет два пара- метра: файловую переменную и номер записи (записи в файле нумеруются последовательно, начиная с единицы). После вызова процедуры SEEK указанная запись, если она существует, становится доступной в буфер- ной переменной файла, иначе устанавливается признак конца файла EOF.
Процедура обеспечивает также доступ для чтения и записи в один и тот же файл, что позволяет непосредственно вносить изменения в записи файла на том же месте.
При чтении/записи для файлов нетекстовых типов используются процедуры GET(<имя файловой переменной>) и PUT(<имя файловой переменной>), где GET берет компоненту из файла, а PUT записывает компоненту в файл.
Пример: программа копирования файла COP.DAT;1 В файл COP1.DAT;1
PROGRAM CPY1(F1,F2,OUTPUT);
VAR F1, F2: TEXT; CH: CHAR; I: INTEGER;
BEGIN
RESET(F1, 'COP.DAT',';1',I); REWRITE(F2, 'COP1.DAT;1', '', I);
WHILE (NOT EOF(F1)) DO BEGIN
READ(F1, CH); WRITE(F2,CH);
END;
WRITELN(' Файл COP.DAT;1 Скопирован в файл COP1.DAT;1');
END.
Варианты заданий:
1) Убрать из текста лишние пробелы, т.е. там, где они встречаются больше одного раза, оставить один пробел
2) Подсчитать количество символов в заданном тексте
3) Подсчитать количество слов и число предложений (предложения оканчиваются точкой, слова разделяются запятыми)
4) Определить, какая буква чаще всего встречается в заданном тексте
5) Если строка начинается с цифры, то перед ней поставить левую круглую скобку, а в конец строки - правую круглую скобку
6) Подсчитать число цифр в данном тексте и их сумму
7) Перед каждым символом поставить порядковый номер в тексте
8) Определить переменную "студент", содержащую следующие поля: имя, фамилия, отчество студента, название института, номер группы. Данные считать из текстового файла. Вывести данные о студентах, которые учатся в одном и том же институте, и в одной группе.
9) Определить, входит ли заданное слово в текст. Если да, то сколько раз
10) Удвоить в тексте каждую литеру
11) Напечатать в алфавитном порядке все буквы, входящие в текст
12) Подсчитать сумму чисел записанных в тексте
13) В тексте записаны слова через пробел. Вывести их в алфавитном порядке
14) Напечатать самое длинное слово, найденное в тексте
15) Во всех словах заменить первую букву на последнюю, а последнюю на первую
16) Удалить из текста все последующие вхождения первой буквы
17) Оставить в слове только первые вхождения каждой буквы
18) Заданное число, от 1 до 1999, напечатать римскими цифрами XLVI и т.д.
19) Определить, является ли текст правильной записью римскими цифрами целого числа от 1 до 1999. Если да, то напечатать это число арабскими цифрами
20) Удалить из текста каждое N-е вхождение в него заданного символа
21) Удалить из текста каждое N-е вхождение в него заданного слова
22) Задан текст. Вывести этот текст, подчеркивая (ставя в следующей строке под этим символом минус) все входящие в него цифры
23) Определить, равны ли два заданных файла
24) Заменить заданное слово в тексте на другое слово
25) Определить строку максимальной длины и вывести ее.
26) Подсчитать, сколько раз в тексте встречается заданное слово.
27) Выбросить из текста заданный знак, где бы он не встречался.
28) Удалить из текста каждое четное предложение.
29) Отформатировать текст следующим образом: каждое предложение должно иметь свой порядковый номер; начинаться с красной строки.
30) Подсчитать, сколько раз в тексте встречается заданный знак.
31) Удалить из текста все предложения, в которых запятые встречаются более 2-х раз.
32) В тексте перед каждым предложением, в котором встречается за- данное слово, поставить восклицательный знак "!"