Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика 2 семестр.doc
Скачиваний:
14
Добавлен:
01.04.2025
Размер:
609.28 Кб
Скачать

2. Файлы данных

Под файлом понимают последовательность однотипных компонент, которая размещается в поименованной области внешнего носителя (жесткого диска, компакт-диска, магнитной ленты и т.п.). Файл может быть элементом структуры, например массива, но он не должен входить в состав другого файла. Число компонент файла при его объявлении не фиксируется и может быть равным нулю (пустой файл). Turbo Pascal позволяет работать с тремя видами файлов: текстовыми, типизированными и нетипизированными. Несмотря на определенные различия в действиях с ними, они используют ряд общих операций, о которых будет сказано далее.

Представителем файла в программе является переменная файлового типа (файловая переменная – ФП). С помощью одной ФП можно работать с разными однотипными файлами. Для этого необходимо связать с ней имя конкретного файла на диске, представленное в соответствии с правилами MS DOS (но не более 79 символов для полного имени), следующей процедурой:

Assign(<ФП>, <Полное имя файла>).

Процедура Rewrite(<ФП>) открывает файл для записи, создавая новый пустой файл или удаляя содержимое существующего файла.

Процедура Reset(<ФП>) открывает существующий текстовый файл для чтения, а другие виды файлов – для чтения или записи (перезаписи). В результате выполнения процедуры маркер файла будет установлен на его первом элементе.

Процедура Close(<ФП>) закрывает файл и освобождает связанный с ним буфер. При ее выполнении в файл, открытый для записи, заносится признак конца файла. Последний может быть обнаружен с помощью логической функции EOF(<ФП>) (End Of File – конец файла). После выполнения процедуры можно связать файловую переменную с другим файлом

Закрытый файл можно удалять процедурой Erase(<ФП>) и переименовывать процедурой Rename(<ФП>, <Новое имя>).

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

Текстовый файл представляет собой совокупность символов, разделенных на строки разной длины, в том числе и пустые. В конце каждой строки стоит признак конца строки, который можно выявить с помощью логической функции EOLn(<ФП>) (End Of Line – конец строки). Признак входит в состав строки своими двумя байтами #13 (CR) и #10 (LF). Файловая переменная описывается служебным словом text (тип текстовый файл). Такие файлы являются файлами последовательного доступа. Это означает, что работа со строками файла может вестись либо в режиме их последовательного чтения, либо их последовательной записи. В первом случае файл должен быть открыт процедурой Reset, во втором – процедурой Rewrite. Имеется возможность открытия файла процедурой Append(<ФП>) для того, чтобы дописать текст в его конец. Запись данных в текстовый файл производят процедурами Write(<ФП>, <Список вывода>) и Writeln(<ФП>, <Список вывода>). Первая из них оставляет текущий указатель в записываемой строке и следующая процедура записи будет выводить данные в эту же строку. Вторая процедура после завершения записи элементов списка в строку переведет текущий указатель в начало новой строки. В списке вывода допустимо записывать через запятую выражения целого, вещественного, логического, символьного типа, типов string и PChar, в том числе с указанием формата записи в файл. При записи чисел происходит автоматическое преобразование числового формата данных в символьный. Процедура Writeln(<ФП>) переводит текущий указатель в начало следующей строки. (Заметим, что на реальном физическом носителе содержимого текстового файла мы не найдем привычных нам строк текста, они присутствуют только в логическом файле, который представлен файловой переменной.) Чтение данных из текстового файла выполняют процедурами Read(<ФП>, <Список переменных>) и Readln(<ФП>, <Список переменных>). Вторая процедура, в отличие от первой, после присвоения переменным значений из строки файла производит переход в начало следующей строки. Переменные могут быть целого, вещественного, символьного типа, типов string и PChar. Процедура Readln(<ФП>) позволяет перейти к следующей строке файла. Обмен данными с файлами происходит опосредованно – через выделяемый при открытии файла буфер обмена (участок оперативной памяти). Физический обмен происходит лишь при заполнении буфера. По умолчанию размер буфера равен 128 байтам. С целью организации эффективного обмена можно изменять размер буфера процедурой SetTextBuf(<ФП>, <Буфер> [,<Размер>]). Третий параметр процедуры является необязательным. Процедура Flush(<ФП>) принудительно записывает данные из буфера в файл независимо от степени заполнения буфера. И последнее: в языке определены две стандартные ФП – Input и Output. Они связаны автоматически с клавиатурой и экраном соответственно, не требуют производить открытие и закрытие файла, и их имена не указывают в процедурах ввода/вывода.

Покажем на примере реализацию действий с текстовыми файлами. Пусть требуется произвести физическое форматирование хранимого в файле текста, например после каждых 45 строк должны идти 5 пустых строк. Ниже представлены структурограмма алгоритма и соответствующая программа.

Ввод имен файлов и значения n

Связывание ФП с именами файлов

Открытие f1 для чтения и f2 для записи

Пока не конец f1

i := 1

Чтение s из f1

Запись s в f2

i := i + 1

До i > n или конца f1

Конец f1 ?

НЕТ

i := 1 (1) 5

Запись в f2 пустой строки

Закрытие f1 и f2

Удаление f1

Переименование f2

program Text_Files;

const n = 45;

s1 = 'ishodn'; s2 = 'rez'; {Исходный и результирующий файлы}

var

f1, f2 : text; {Описание файловых перменных}

i : byte;

s : string;

begin

assign(f1,s1); assign(f2, s2); {Связываем файловые переменные с файлами}

reset(f1); {Пусть исходный файл уже создан в текстовом редакторе}

rewrite(f2); {Открываем результирующий файл для записи}

while not eof(f1) do begin

i := 1; {Начинаем считать строки от 1 до 45}

repeat

readln(f1, s); {Читаем строку из файла f1}

writeln(f2, s); {Пишем строку в f2}

i := 1 + 1 {Переходим к следующей строке}

until (i > n) or eof(f1);

if not eof(f1) then {Если не кончился f1, вставляем в f2 пустые строки}

for i := 1 to 5 do writeln(f2)

end; {while}

close(f1); close(f2);

erase(f1); {Удаляем исходный файл}

rename(f2, s1) {Переименовываем результирующий файл}

end.