Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Labs7-12.doc
Скачиваний:
10
Добавлен:
10.05.2015
Размер:
131.58 Кб
Скачать

Лабораторная работа 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) В тексте перед каждым предложением, в котором встречается за- данное слово, поставить восклицательный знак "!"

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]