Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
delphi / песни о паскале.pdf
Скачиваний:
62
Добавлен:
26.03.2016
Размер:
5.16 Mб
Скачать

Глава 25 Текстовые файлы

Мы мастерим программу шифрования текста. Шифрование отдельной строки освоено нами в предыдущей главе. Теперь научимся читать строки из одного файла и записывать их в другой.

Файлы хорошие и разные

Файлы — это хранилища данных, там может быть всё что угодно: музыка, фильмы, книги. Ясно, что эта информация как-то закодирована, то есть, представлена в виде чисел — байтов. Файл любого типа — это набор байтов, хранящийся на диске (говорим пока о дисковых файлах). Каждому типу файлов нужен свой подход: к файлу нужна программа, «понимающая» его содержимое. Вам угодно слушать музыку? — к вашим услугам медиа-проигрыватель. Или надо печатать текст? — тогда запустите редактор текста. Но не наоборот! А всё потому, что каждый тип файлов обладает структурой, понятной лишь соответствующей программе. Таким образом, файл и программа для работы с ним составляют логическое единство, — одно без другого лишено смысла.

Стало быть, структура или формат файла — его важнейшая характеристика. Все файловые форматы можно разделить на две категории:

текстовые файлы;

все прочие файлы, — их называют двоичными или бинарными.

Оформате файла можно судить по его расширению. К текстовым относятся файлы с расширениями TXT — текст, BAT — пакетный файл, LOG — файл протокола и многие другие. Файлы наших программ с расширением PAS — тоже

текстовые. А вот документы в формате Word (с расширением DOC) обладают сложной структурой, правильнее отнести их к бинарным. То же скажем о книгах PDF-формата. В отличие от DOC и PDF, текстовые файлы открываются простыми редакторами текста — вроде «Блокнота» или редактора нашей IDE, который тоже работает лишь с текстовыми файлами.

Формат текстовых файлов

Итак, любой файл — это набор байтов, записанных на диске. Как же расположены байты в текстовых файлах? — мы должны это знать. Воспользуемся неким «волшебным микроскопом» и рассмотрим через него отдельные байты небольшого текстового файла, составленного из четырех строк: в первой помещены три символа «1», во второй — два символа «2», третья строка пуста, а четвертая содержит символ «3».

Примечание. Вы можете исследовать текстовый файл в HEX-режиме просмотра такими программами, как Far, Total Commander и им подобными.

163

Глава 25

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

111

22

3

Наш воображаемый микроскоп изобразит этот файл цепочкой чисел (здесь показаны десятичные числа, хотя в HEX-режиме видны шестнадцатеричные).

49 49 49

13 10

50 50

13 10

13 10

51

13 10

Числа 49, 50 и 51 — это коды символов «1», «2» и «3» (по кодировке ASCII), а подчеркнутые мною числа 13 и 10 — это парочка управляющих байтов, разбивающая файл на строки. Открыв такой файл редактором, мы не увидим управляющих байтов, но в файле они есть! Любая программа, работающая с текстовыми файлами, умеет находить эти ограничители строк при чтении текста и вставлять их в файл при записи в него.

История названий ограничителей исходит из глубины веков. Символ с кодом 13 назван Carriage Return — «возврат каретки» или сокращенно CR. Те, кто застал электрические пишущие машинки прошлого, помнят: перед печатью следующей строки, каретка такой машинки сдвигалась в крайнюю правую позицию, — это и есть возврат каретки.

А управляющий символ с кодом 10 назван Line Feed (LF) — «подача строки». Он заведовал подачей бумаги в продольном направлении с тем, чтобы следующая строка печаталась после предыдущей. Вот так и работал консольный интерфейс прошлого: барабанил буквочку за буквочкой, пока не получал управляющие коды CR и LF. Тогда каретка со скрежетом сдвигалась вправо, барабан, дёрнувшись, слегка смещал бумагу вперед, и печаталась следующая строка.

С годами формат текстовых файлов не изменился, и будет жить, пока существуют компьютеры. Секрет его живучести — в простоте и универсальности. В некоторых операционных системах текстовые файлы разбивают на строки не парой символов CR+LF, а лишь одним из них. Это по сути ничего не меняет, — файл по-прежнему являет последовательность строк-макаронин, нарубленных управляющими символами.

Доступ к текстовым файлам

В Паскале можно работать с файлами любых типов — и текстовыми, и бинарными. Сейчас нас интересуют лишь текстовые, о бинарных пока умолчим.

Сложно ли работать с текстовыми файлами? Расслабьтесь, — это совсем не больно! Вы уже работаете с ними, даже не подозревая об этом. Чтение и запись строк в текстовые файлы выполняют всё теми же процедурами Readln и Writeln. Но с одним маленьким отличием: в первом параметре этих процедур

164

Глава 25

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

дается ссылка на файловую переменную типа TEXT, которая должна быть объявлена в программе следующим образом:

var F: Text; { файловая переменная }

Тогда чтение и запись через переменную F выполнятся так:

Readln (F, S); { Чтение одной строки файла в переменную S }

Writeln (F, ’Эта строка запишется в файл’);

Где тут сложности? Их не видно, но пока неясно вот что:

С каким именно файлом мы работаем? Ведь на диске их так много!

В каком месте файла будет прочитана строка, и куда она будет помещена при записи?

Для ответа рассмотрим порядок чтения книги. Обычно я поступаю так:

1.Выбираю книгу на полке.

2.Открываю её в начале.

3.Читаю, пока не прочту или не усну.

4.В конце концов закрываю книгу и возвращаю на полку.

Точно так же — в четыре счета — обрабатывается файл. Далее в этой главе мы займемся чтением из файла, а запись в него рассмотрим в следующей главе.

Чтение из файла

Пусть нами объявлена файловая переменная F типа TEXT. Прежде чем воспользоваться ею для чтения некоторого файла, надо связать имя этого файла с файловой переменной. Это похоже на выбор книги для чтения — первый шаг в нашем списке. Связывание выполняют процедурой Assign — «назначить», в неё передают два параметра: файловую переменную и имя файла, например:

Assign(F, ’C:\AUTOEXEC.BAT’);

Имя файла можно задать константой, переменной или их комбинацией — строковым выражением. Оно должно отвечать правилам, действующим в операционной системе. Указанный файл должен существовать, и система должна знать, где его найти. Впрочем, процедура Assign ничего не проверяет, она лишь помещает имя файла внутрь файловой переменной. И, если файла с указанным именем нет, процедура «не заметит» этого, но ошибка обнаружится на следующем шаге — при попытке открыть файл.

165

Глава 25

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

Второй шаг подготовки к чтению — открытие файла. Это вроде открытия книги на первой странице, оно выполняется процедурой Reset (что значит сброс или установка в исходное состояние). Этой процедуре нужен лишь один параметр

— файловая переменная.

Reset(F);

Процедура Reset готовит файл к чтению, обращаясь при этом к операционной системе. Система выделяет память для работы с файлом, а также блокирует его, не давая другим программам удалить файл. После успешного открытия файловую переменную можно использовать далее в процедуре Readln так, как это было сказано выше. А если имя файла оказалось неверным или файл не существует? Тогда вызов процедуры Reset приведет к ошибке: программа сообщит: «File not found» — файл не найден, и аварийно прекратит работу.

После успешного открытия файла переходят к третьему этапу — собственно чтению из него (чтению книги). С этим вы уже знакомы, поскольку чтение выполняется известной процедурой Readln. Например, прочитать строку из файла можно так.

Readln(F, S);

Здесь S — это переменная строкового типа. Обратите внимание: в переменную S попадут только видимые символы строки, а управляющие коды — разделители строк — останутся «за бортом».

Но которая из строк файла будет прочитана? Первая, вторая или иная? При первом вызове после Reset процедура Readln прочтет первую строку файла, при втором — вторую и так далее. Если организовать цикл, то чтение продолжится вплоть до последней строки.

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

А что случится после чтения последней строки? Позиция достигнет конца файла, и очередной вызов процедуры Readln вызовет ошибку — событие крайне нежелательное. Чтобы избежать его, надо отслеживать достижение конца файла. Паскаль даёт для этого функцию по имени EOF, что означает End Of File — «конец файла». Булева функция EOF принимает один параметр — файловую переменную, и возвращает TRUE, когда позиция чтения «упирается» в конец файла.

166

Соседние файлы в папке delphi