ЛАБОРАТОРНАЯ РАБОТА №6
Работа с текстовыми файлами
Цель и задача работы: изучить приёмы записи и чтения текстовых файлов с помощью процедур и функций Турбо Паскаля.
Файлы
Под файлом понимается либо именованная область внешней памяти ПК (жесткого диска, дискеты) либо логическое устройство – потенциальный источник и приемник информации.
Любой файл имеет три характерные особенности. Во-первых, у него есть имя, что дает возможность программе работать одновременно с несколькими файлами. Во-вторых, он содержит компоненты одного типа. В-третьих, длина вновь создаваемого файла никак не оговаривается при его объявлении и ограничивается только емкостью устройства внешней памяти.
Файловый тип, или переменную файлового типа можно задать одним из трех способов:
<имя> = FILE OF <тип>;
<имя> = TEXT;
<имя> = FILE;
Здесь <имя> – имя файлового типа (правильный идентификатор)
FILE, OF – зарезервированные слова (файл, из)
<тип> – любой тип Турбо Паскаля, кроме файлов.
Например
type
product = record
name: string;
code: word;
price: real;
end;
text80 = file of string[80];
var
f1: file of char;
f2: text;
f3: file;
f4: text80;
f5: file of product;
В зависимости от способа объявления можно выделить три вида файлов:
· типизированные (задаются предложением FILE OF …);
· текстовые файлы (определяются типом TEXT);
· нетипизированные файлы (определяются типом FILE).
В нашем примере f1, f4, f5 – типизированные файлы, f2 – текстовый файл, f3 – нетипизированный файл. Вид файла, вообще говоря, определяет способ хранения информации в файле. Однако в Турбо Паскале нет средств контроля вида ранее созданных файлов. При объявлении уже существующих файлов программист сам должен следить за соответствием вида объявления характеру файла.
Доступ к файлам
Любые файлы становятся доступны программе только после выполнения особой процедуры открытия файла. Эта процедура заключается в связывании ранее объявленной файловой переменной с именем существующего или вновь создаваемого файла, а также в указании направления обмена информацией: чтение из файла или запись в него.
Файловая переменная связывается с именем файла в результате обращения к стандартной процедуре ASSIGN:
ASSIGN (<ф.п.>, <имя файла>);
Здесь <ф.п.> – файловая переменная (правильный идентификатор объявленный в программе как переменная файлового типа);
<имя файла> – текстовое выражение, содержащее имя файла.
Имена файлов
Имя файла – это любое выражение строкового типа, которое строится по правилам определения имен в MS-DOS (операционной системе ПК).
· Имя содержит до восьми разрешенных символов – прописных и строчных латинских букв, цифр и символов:!, @, #, $, %, ^, &, (,), ~, –, _
· За именем может следовать расширение – последовательность до трех разрешенных символов; расширение, если оно есть, отделяется от имени точкой.
· Перед именем может ставиться так называемый путь к файлу: имя диска и/или имя текущего каталога и имена каталогов вышестоящих уровней.
· Максимальная длина имени файла вместе с путем – 79 символов.
Например
const
name=’e:\student\2-ai-11\try.txt’;
var
f: Text;
begin
assign(f,name);
...
Если указывается только имя файла (имеется в виду имя.расширение), то при выполнении процедуры ASSIGN программа добавляет к имени файла в качестве пути путь текущего каталога.
После связывания файловой переменной с файлом процедура работы с файлом состоит из следующих этапов:
· инициация файла;
· чтение и/или запись информации; (может повторяться сколько угодно раз)
· закрытие файла.
Инициация файла
Инициировать файл означает указать для этого файла направление передачи данных. В Турбо Паскале можно открыть файл для чтения, для записи информации, а также для чтения и для записи одновременно.
Для чтения файл инициируется с помощью стандартной процедуры RESET:
RESET(<ф.п.>);
Здесь <ф.п.> – файловая переменная, связанная ранее процедурой ASSIGN с уже существующим файлом.
При выполнении этой процедуры дисковый файл подготавливается к чтению информации. В результате специальная переменная-указатель, связанная с этим файлом будет указывать на начало файла, т.е. на компонент с порядковым номером 0.
Если делается попытка инициировать чтение из несуществующего файла, возникает ошибка периода исполнения, которая приведет к аварийному завершению программы.
Стандартная процедура REWRITE(<ф.п.>) инициирует запись информации в файл, связанный ранее с файловой переменной <ф.п.>. Процедурой REWRITE нельзя инициировать запись информации в ранее существовавший дисковый файл: при выполнении этой процедуры старый файл уничтожается и никаких сообщений при этом в программу не передаётся. Новый файл подготавливается к приему информации и его указатель принимает значение 0.
Стандартная процедура APPEND(<ф.п.>) инициирует запись в ранее существовавший текстовый файл для его расширения, при этом указатель файла устанавливается в его конец. Процедурой APPEND нельзя инициировать запись в типизированный или нетипизированный файл. Если текстовый файл ранее уже был открыт с помощью RESET или REWRITE, использование процедуры APPEND приведет к закрытию этого файла и открытию его вновь, но уже для добавления записей.
Закрытие файла
Процедура CLOSE закрывает файл, однако связь файловой переменной с именем файла, установленная ранее процедурой ASSIGN, сохраняется. Формат обращения:
CLOSE(<ф.п.>)
При создании нового или расширении старого файла процедура обеспечивает сохранение в файле всех новых записей и регистрацию файла в каталоге. Функции процедуры CLOSE выполняются автоматически по отношению ко всем открытым файлам при нормальном завершении программы. Поскольку связь файла с файловой переменной сохраняется, файл можно повторно отрыть без дополнительного использования процедуры ASSIGN.
Текстовые файлы
Текстовый файл связывается с файловой переменной, принадлежащей к стандартному типу TEXT. Текстовые файлы предназначены для хранения текстовой информации (например, исходные тексты программ).
Текстовый файл трактуется в Турбо Паскале как совокупность строк переменной длины. Доступ к каждой строке возможен лишь последовательно, начиная с первой. При создании текстового файла в конце каждой записи (строки) ставится специальный признак конца строки, а в конце всего файла – признак конца файла. Эти признаки можно протестировать специальными логическими функциями:
EOF(<ф.п.>): boolean – возвращает TRUE, если файловый указатель стоит в конце файла.
EOLN(<ф.п.>): boolean – возвращает TRUE, если файловый указатель стоит в конце строки.
Чтение из текстового файла осуществляется с помощью процедур
READ (<ф.п.>, <сп. ввода>)
READLN (<ф.п.>, <сп. ввода>)
Здесь <сп. ввода> – список ввода: последовательность одной или более переменных типа CHAR, STRING, а также любого целого или вещественного типа.
Запись в текстовый файл осуществляется с помощью процедур
WRITE (<ф.п.>, <сп. вывода>)
WRITELN (<ф.п.>, <сп. вывода>)
Здесь <сп. вывода> – список вывода: последовательность одного или более выражений типа CHAR, STRING, а также любого целого или вещественного типа.
Пример 1.
Вывод на экран исходного текста программы
var
f: text;
s: string;
begin
assign(f,'myprog.pas');
reset(f);
while not eof(f) do
begin
readln(f,s);
writeln(s);
end;
close(f);
end.
Пример 2.
Считывание массива значений из файла
const N = 1000;
var
f: text;
m: array[1..N] of real;
i: integer;
begin
assign(f,'prog.dat');
reset(f);
i:= 1;
while not eof(f) do
begin
read(f,m[i]); {весь файл рассматривается как одна длинная строка}
i:= i+1;
end;
close(f);
Пример 3.
Запись текста в текстовый файл.
var
f: text;
s: string;
begin
assign(f,'MyText.txt');
rewrite(f);
repeat
readln(s);
if length(s)>0 then writeln(f,s);
until length(s)=0;
close(f);
end.
Задания для самостоятельной работы
Разработать программу на Турбо Паскале, которая обеспечивает решение поставленной задачи в соответствии с предложенным вариантом. Первая цифра - номер задания, вторая - номер варианта.
1. Выполнить обработку текстового файла по указанному алгоритму.
1.1. Вывести на экран самую длинную строку файла.
1.2. Вывести на экран все строки длиной не менее X символов. Значение X задаётся пользователем.
1.3. Вывести на экран все строки, в которых находится слово, заданное пользователем.
1.4. Вывести на экран каждую пятую строку файла.
1.5. Вывести на экран все строки длиной не более X символов. Значение X задаётся пользователем.
1.6. Вывести на экран самую короткую строку файла.
1.7. Вывести на экран три строки с номерами, заданными пользователем. Если строк с такими номерами нет, выдать сообщение.
1.8. Вывести на экран все строки, которые начинаются со слова, заданного пользователем.
1.9. Вывести на экран все строки, которые не заканчиваются символом «.» <точка>.
1.10. Вывести на экран все строки, в которых нет слова, заданного пользователем.
2. Разработать программу преобразования исходного текстового файла в новый файл, которая будет выполнять заданную обработку строк исходного файла.
2.1. После каждой десятой строки добавлять пустую строку, номер страницы, который должен последовательно увеличиваться с единицы. За номером должны следовать ещё две пустые строки.
2.2. Из двух исходных строк, идущих друг за другом сформировать одну, если их суммарная длина менее 70 символов.
2.3. Если исходная строка заканчивается символом «:» <двоеточие> или «;» <точка с запятой>, то в начало следующей строки добавить «-» <дефис>.
2.4. Записывать в файл только первые 70 символов каждой строки. Если строка оказывается длиннее 70 символов, то в конце строки добавлять «…» <многоточие>.
2.5. Если исходная строка начинается со слова «Рисунок», то до и после неё вставить пустые строки.
2.6. Если в исходном файле встречается несколько идущих подряд пустых строк, то их нужно заменить одной пустой строкой.
2.7. При записи строк в новый файл, менять местами соседние строки, например: исходный порядок следования 1, 2, 3, 4, …; после выполнения программы: 2, 1, 4, 3, …
2.8. Строки нового файла формируются по принципу: исходная строка +<пробел>+ длина исходной строки.
2.9. Первые десять строк исходного файла записать в конец нового файла. Программа должна корректно работать с исходными файлами, содержащими меньше 10 строк.
2.10. В начало каждой строки добавлять столько пробелов, чтобы её длина равнялась 50 символов. Если исходная длина строки больше 50 символов, то никаких преобразований выполнять не надо.
Контрольные вопросы
- Для чего используются подпрограммы?
- В каких случаях разумно использовать структурированный тип запись?
- В каких случаях используются массивы?
- Какой оператор цикла лучше использовать при работе с массивами? Почему?
- Чем различаются способы использования процедур и функций?
- Дайте понятие рекурсивного вызова функций?
- Что такое библиотеки подпрограмм?
- Каков формат описания библиотек в Турбо Паскале?
- Какие преимущества даёт использование библиотек?
- Какие функции и процедуры содержит библиотека Турбо Паскаля CRT?
- Сформулируйте основные особенности использования строкового типа в Турбо Паскале?
- Опишите последовательность действий, выполняемых при работе с файлами.
- В чём разница между типизированными, нетипизированными и текстовыми файлами?
Библиографический список
1. Фаронов В.В. Turbo Pascal 7.0. Начальный курс. Учебное пособие. – 2000 г.
2. Долинский М.С. Алгоритмизация и программирование на Turbo Pascal: от простых до олимпиадных задач: Учебное пособие. – СПб.: Питер, 2005.
3. Зуев Е.А. Turbo Pascal. Практическое программирование – М.: «Издательство ПРИОР», 1999.