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

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

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

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

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

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

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

      var F: Text;

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

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

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

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

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

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

Чтобы прояснить это, рассмотрим процесс чтения книги. Обычно я поступаю так:

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

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

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

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

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

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

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

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

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

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

      Reset(F);

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

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

      Readln(F, S);

Перейти на страницу:

Похожие книги