- •§4. Файлы
- •4.1. Общие положения
- •4.2. Классификация файлов.
- •4.3. Файловый тип данных.
- •4.4. Стандартные процедуры для работы с файлами
- •4.5. Типизированные файлы
- •4.6. Текстовые файлы
- •4.7. Дополнительные процедуры и функции, используемые при работе с файлами
- •4.8. Стандартные файлы
- •Задачи для самостоятельного решения.
- •§5. Использование стандартных библиотечных модулей
- •5.1. Модуль crt
- •5.1.1. Программирование клавиатуры
- •5.1.2. Текстовый вывод на экран
- •5.2. Модуль graph
- •5.2.1. Переход в графический режим и возврат в текстовый.
- •5.2.2. Инициализация графического режима
- •5.2.3. Экран и окно в графическом режиме
- •5.2.4. Рисование линий и точек.
- •5.2.5. Рисование многоугольников
- •5.2.6. Рисование дуг, окружностей, эллипсов
- •5.2.7. Краски, палитры, заполнения
- •5.2.8 Вывод текста
- •Задачи для самостоятельного решения.
- •Литература
4.6. Текстовые файлы
Особый вид файлов представляют собой текстовые файлы. Они предназначены для хранения текстовой информации. Текстовый файл трактуется в Турбо Паскале как совокупность строк переменной длины. Доступ к каждой строке возможен лишь последовательно, начиная с первой. Для описания текстовых файлов используется предопределенный тип Text.
Переменные этого типа удобнее описывать в программе явно в разделе переменных Var:
var <имя файловой переменной> : Text;
При создании текстового файла в конце каждой записи (строки) ставится специальный признак конца строки. Данный признак представляет собой последовательность из двух символов кода ASCII - символа с кодом #13 ("возврат каретки") и символа с кодом #10 ("перевод строки"). Для определения конца строки используется функция EOLN (end of line).
Формат обращения к функции в программе:
EOLN (<имя файловой переменной>);
Данная функция принимает значение True, если достигнут конец строки, и значение False в противном случае. Если у функции Eoln параметр пропущен, то подразумевается использование стандартного файла Input.
В конце всего файла ставится признак конца файла. Данный признак представляет собой символ кода ASCII - символ с кодом #26. Для определения конца файла используется функция EOF (end of file).
Формат обращения к функции в программе:
EOF (<имя файловой переменной>);
Данная функция принимает значение True, если достигнут конец файла, и значение False в противном случае.
Структуру текстового файла можно представить следующим образом:
код символа |
. . . |
код символа |
Eoln |
|
|
код символа |
. . . |
. . . |
. . . |
код символа |
Eoln |
код символа |
. . . |
. . . |
код символа |
Eoln |
|
код символа |
. . . |
код символа |
Eoln |
|
|
код символа |
. . . |
. . . |
. . . |
код символа |
Eof |
Для доступа к компонентам текстового файла используются процедуры Read и Readln, Write и Writeln. Они отличаются возможностью обращения к ним с переменным числом фактических параметров, в качестве которых могут использоваться символы, строки и числа. Первым параметром в любой из перечисленных процедур может стоять файловая переменная. В этом случае осуществляется обращение к дисковому файлу или логическому устройству, связанному с переменной процедурой Assign. Если файловая переменная не указана, то происходит обращение к стандартным файлам Input и Output.
Процедура Read. Процедура Read обеспечивает ввод символов, строк и чисел.
Формат вызова процедуры в программе:
Read (<имя файловой переменной>, <список параметров>); или
Read (<список параметров>);
Список параметров - это последовательность из одной или более переменных типа char, string, а также для любого целого или вещественного типа.
При вводе переменных типа char выполняется чтение одного символа из файла и присваивание считанного значения переменной. Если перед выполнением чтения указатель файла достиг конца очередной строки, то результатом чтения будет символ CR (ASCII код #13), а если достигнут конец файла, то символ EOF ( код #26). При вводе с клавиатуры символ CR вводится при нажатии на клавишу Enter, а символ EOF - при одновременном нажатии клавиш CTRL и Z.
При вводе переменных типа string количество считанных процедурой и помещенных в строку символов равно максимальной длине строки, "лишние" символы до конца строки отбрасываются, а новое обращение к Read возвращает пустую строку. Таким образом, процедура Read не в состоянии прочесть последовательность строк: первая строка будет прочитана нормально, а все последующие окажутся пустыми. Для ввода последовательности строк нужно использовать процедуру Readln (см. ниже).
При вводе числовых переменных процедура Read вначале выделяет подстроку во входном потоке по следующему правилу: все ведущие пробелы, символы табуляции и маркеры конца строк Eoln пропускаются; после выделения первого значащего символа, наоборот, любой из перечисленных символов или символ EOF служит признаком конца подстроки. Выделенная таким образом подстрока затем рассматривается как символьное представление числовой константы соответствующего типа и преобразуется во внутреннее представление числа, а полученное значение присваивается переменной. Если в подстроке был нарушен требуемый формат представления числовой константы, возникает ошибка ввода - вывода. Если при пропуске ведущих пробелов встретился символ EOF, переменная получает значение 0.
При использовании процедуры Read применительно к стандартному файлу Input, т.е. при вводе с клавиатуры, символьные строки запоминаются в буфере, информация из которого передается процедуре только после нажатия клавиши ввода. Это позволяет редактировать данные при их вводе.
Процедура Readln. Процедура Readln обеспечивает ввод символов, строк и чисел. Эта процедура идентична процедуре Read, за исключением того, что после считывания значения последней переменной оставшаяся часть строки до маркера EOLN пропускается, поэтому следующее обращение к Readln или Read начинается с первого символа новой строки. Кроме того, эту процедуру можно вызвать без параметра <список переменных>, что приведет к пропуску всех символов текущей строки вплоть до EOLN.
Процедура Write. Процедура Write обеспечивает вывод информации в текстовый файл или передачу ее на логическое устройство.
Формат вызова процедуры в программе:
Write (<имя файловой переменной>, <список параметров>); или
Write (<список параметров>);
Список параметров - это последовательность из одного или более выражений типа char, string, boolean, а также для любого целого или вещественного типа. Файловая переменная, если она указана, должна быть предварительно описана как переменная типа Text и связана с именем файла или логическим устройством процедурой Assign. Если файловая переменная отсутствует, подразумевается вывод в стандартный файл Output, который обычно связан с экраном ПК.
Процедура Writeln. Процедура Writeln идентична процедуре Write за исключением того, что выводимая строка символов завершается кодами CR и LF. При вызове Writeln можно опускать <список параметров>: в этом случае в файл передается маркер EOLN, что при выводе на экран приведет к переводу курсора в начало следующей строки.
Процедура Append. Процедура Append открывает ранее существующий текстовый файл для добавления данных в конец файла. При этом указатель файла устанавливается в его конец. Если текстовый файл уже был открыт с помощью процедур Reset или Rewrite, использование процедуры Append приведет к закрытию этого файла и открытию его вновь, но уже для добавления записей.
Формат вызова процедуры в программе:
Append (<имя файловой переменной>);
Задания на текстовые файлы.
Пример 1. Скопировать текстовый файл Т1 в текстовый файл Т2 с сохранением строчной структуры файла Т1.
program COPYFILE; { вариант 1 } var T1,T2:text; c:char; begin assign(T1,'a:dan1.pas'); assign(T2,'а:dan2.txt'); Reset(T1); Rewrite(T2); While not eof(T1) do begin While not eoln(T1) do Begin Read(T1,c); Write(T2,c) end; Readln(T1); Writeln(T2) end; Close(T1); Close(T2) end. |
Program COPYFILE; {вариант 2 } Var T1,T2:text; c:string; Begin Assign(T1,'а:dan1.txt'); Assign(T2,'а:dan21.txt'); Reset(T1); Rewrite(T2); While not eof(T1) do Begin Readln(T1,c); Writeln(T2,c) End; Close(T1); Close(T2) End. |
Замечание 1. Выше представлены два варианта программы. В первом варианте выполняется считывание элементов строки посимвольно, а во втором - считывание данных происходит построчно.
Замечание 2. Перед запуском программы следует файл dan1.txt на диске а. Например, открыть новое окно в среде ТР, набрать несколько строк текста и записать файл под именем dan1.txt. Чтобы увидеть результаты работы программы, т.е. содержимое файла dan2.txt, следует открыть этот файл.
Пример 2. Дан текстовый файл, содержащий только целые числа, которые разделяются пробелами. Вывести на экран все числа с учетом разбиения на строки и подсчитать количество элементов в каждой строке.
Program Chisla;
var F: text; x,k: integer;
begin
assign(F,’a:int1.txt’); Reset(F);
While not eof( F ) do
begin k:=0;
While not eoln( F ) do
begin Read(F,x); Write(x,’’); Inc(k) end;
Writeln(‘ в строке ‘, k, ’ элементов’);
Readln(F)
end;
Close(F); Readln
end.
Замечание. Процедура Inc(k) увеличивает значение счетчика k на 1.
