С термином «файл» вам уже приходилось встречаться. Прежде всего, это понятие обычно связывают с информацией на устройствах внешней памяти. В Паскале понятии файла употребляется в двух смыслах:
В программе между этими объектами устанавливается связь. Вследствие этого все, что происходит в процессе выполнения программы с внутренним файлом, дублируется во внешнем файле. С элементами файла можно выполнять только две операции: читать из файла и записывать в файл.
Файловый тип переменной – это структурированный тип, представляющий собой совокупность однотипных элементов, количество которых заранее (до исполнения программы) не определено.
Для работы с файлом при описании переменных необходимо определить переменную файлового типа, которая будет считаться «представителем» этого файла в данной программе. Такая переменная называется также указателем. Структура описания файловой переменной:
В качестве базового типа можно использовать любой тип, за исключением типа File.
Количество элементов, хранящихся в данный момент в файле, называется его текущей длиной. Существует специальная ячейка памяти, которая хранит адрес элемента файла, предназначенного для текущей обработки (записи или чтения). Этот адрес называется указателем или окном файла. Указатель всегда указывает на конкретный элемент файла, поэтому существует понятие текущий указатель.
Обычно все действия с файлами производятся поэлементно, причем с тем элементом файла, на который указывает текущий указатель. При записи или считывании указатель перемещается к следующему элементу.
Поскольку число элементов файла не задается, то последним элементом файла всегда записывается символ конца файла (eof). В языке Паскаль существует булевская функция eof( ), результат которой – true, если указатель указывает на конец файла.
Основные операции с файлами
Эти операции необходимы на начальном этапе работы с файлами – для связывания файловой переменной с конкретным файлом, указания того, какие действия будут с ним проводиться и окончания работы с файлом. К ним относят:
Диск: \ имя каталога \ имя подкаталога \ … \ имя файла
Если имя диска и имя каталога не указывать, то берутся текущий диск и текущий каталог.
В эту группу входят:
Эта группа предназначена для действий с каталогами и именами. Некоторые из операций:
Примеры работы с файлами*
В качестве примеров рассмотрим три наиболее часто встречающихся действия с файлами:
Для чтения файла необходимо выполнить следующий алгоритм:
Пример программы, реализующей этот алгоритм:
После того, как мы связали файл с файловой переменной с помощью оператора Assign(F,FileName), открываем файл с помощью оператора Reset(F). В результате файловая переменная f указывает на первый элемент файла:
С помощью оператора Read(F,Ch) в переменную Ch считывается значение, которое находится в том месте файла, на которое указывает переменная F, т.е. C. Затем указатель перемещается на следующий элемент файла:
После этого значение переменной Ch выводится на экран с помощью оператора Write(Ch). Затем аналогичным образом считываются из файла значения 2-го, 3-го и т.д. элементов до тех пор, пока файловая переменная не будет указывать на конец файла.
Алгоритм записи данных в файл можно определить следующим образом:
Пример программы, реализующей этот алгоритм и записывающей в файл числа от 1 до 30:
При открытии файла с помощью процедуры Rewrite(F) файл выглядит следующим образом:
Так как файловая переменная указывает на конец файла, мы можем записать в него любую информацию с помощью процедуры Write, например,
Необходимо отметить, что в отличии от вывода на экран, при записи информации в файл вторым аргументом оператора Write являются не выражения, а переменные. Следующие записи будут неверны: Write(F,1), Write(F, x+1).
Пусть необходимо к уже существующему файлу добавить ряд элементов. Для этого необходимо выполнить следующие действия:
Пример: к уже имеющемуся файлу, в который занесены числа от 1 до 30, дописать числа 40, 50, 60, 70, 80.
При открытии файла с помощью процедуры Reset вся информация в файле остается без изменения, курсор устанавливается на первый элемент файла:
Затем с помощью операции seek(f,filesize(f)) перемещаем файловую переменную на последний элемент файла:
Так как файловая переменная указывает на конец файла, мы можем дописать в файл любую информацию, например, с помощью оператора Write(f, 31);
Текстовые файлы
Отдельным типом файлов являются текстовые файлы. Особенность этих файлов заключается в том, что их содержимое рассматривается как последовательность строк переменной длины, разделенных специальными символами, которые называются «конец строки». Символ конца строки при просмотре файла не виден, так же как и символ конца файла. В программе файловая переменная текстового типа описывается следующим образом:
Var :text;
Каждый символ представлен во внутреннем коде (ASCII) и занимает 1 байт.
Главная особенность текстовых файлов заключается в том, что можно считывать из него и записывать в него элементы типа char,integer,real,string,boolean. Если информация несимвольная, то в процессе чтения или записи происходит ее преобразование из символьной формы во внутреннюю и обратно.
Для работы с текстовыми файлами можно использовать все процедуры и функции, используемые при работе с файлами любых типов, за исключением процедуры seek, функций filepos,filesize. Дело в том, что заранее неизвестно, элементы какого типа находятся в файле.
Например, если в файле находится символ 5, то мы можем его считать как char,integer,real,string размером 1. В этом случае они будут занимать: real– 4 байта; integer — 2 байта; char– 1 байт; string— 1 байт.
Для работы с текстовыми файлами определены дополнительные операции.
Функция:
eoln (f) – логическая функция, возвращающая логическое значение true, если достигнут конец строки, и false в противном случае.
Для участия в олимпиаде по информатике вы должны уметь работать с текстовыми файлами (считывать и записывать информацию). На олимпиадах, начиная с областных, они используются для ввода и вывода данных. Лучше всего попробовать работать с файлами до того, как Вы пойдете на олимпиаду.
На этом уроке мы рассмотрим, как используются текстовые файлы для ввода и вывода данных в программе на языке Паскаль.
Текстовые файлы – это файлы, содержащие символы, разделенные на строки. Причем в конце каждой строки стоит символ конца строки.
Общая последовательность действий при работе с файлами в языке программирования Паскаль:
Описание переменной файлового типа
С текстовым файлом на диске в программе должна быть связана файловая переменная, которая описывается с указанием стандартного типа Text:
Связь переменной файлового типа с конкретным внешним файлом
Для установления связи между файловой переменной и именем файла, присваиваемого операционной системой, имеется стандартная процедура Assign.
Такое соответствие обозначает, что все операции, выполняемые над переменной F1, будут выполняться над файлом, хранящемся на диске и имеющим имя ‘Int.dat’
Чтение из файла
Под чтением из файла понимается ввод данных из внешнего файла, находящегося на диске, в оперативную память. Данные входного файла становятся доступными программе.
Для чтения файла в программе необходимо выполнить следующие действия:
Открыть файл для чтения:
Процедура Read последовательно считывает все элементы строки:
Процедура Readln – считывает элемент из текущей строки и переходит на следующую строку (независимо от того, достигнут конец строки или нет):
Если не указывать второй параметр, то произойдет переход в начало следующей строки без ввода данных:
Закрытие файла
Общий вид оператора:
Общая форма чтения файла имеет вид:
Многоточием отмечено наличие других операторов в программе.
Признак конца файла
Так как, по определению, число элементов файла не задается заранее, то в языке Паскаль введена логическая функция Eof() для определения признака конца файла.
Она определяет, достигнут ли конец файла или еще нет (принимает значение (true), если достигнут конец файла, и ложь (false) — в противном случае).
Для определения конца файла используется оператор цикла, например, (пока не достигнут конец файла …):
While Not EOF ( ) Do …
Запись в файл
Под записью файла понимается вывод результатов программы из оперативной памяти на диск, т.е. создание нового файла на внешнем устройстве.
Для записи файла в программе необходимо выполнить следующие действия:
Открыть файл для записи с помощью процедуры Rewrite:
Записать данные в файл спомощью процедур Write или Writeln.
Процедура Write производит запись поэлементно в текущую строку:
Процедура WriteLn записывает элемент и переводит указатель в начало следующей строки:
Если не указывать второй параметр процедуры, то в конце данной строки ставится признак конца файла и текущий указатель перемещается на начало следующей строки:
После завершения работы с файлом его закрытие обязательно.
Общая форма записи файла имеет вид:
Логическая функция Eoln()
Часто для обработки текстовых файлов используется специфичная для них функция Eoln(), позволяющая определить, достигнут ли конец строки. Если достигнут — значение функции равно True, а если нет — False.
Таким образом, для анализа конкретных символов строк файла можно применить вложенный цикл типа:
Пример. Дан текстовый файл, содержащий только целые числа, в каждой строке может быть несколько чисел, которые разделяются пробелами. Вывести на экран все числа с учетом разбиения на строки и подсчитать количество элементов в каждой строке.
Пусть в файле содержится следующая информация:
Этот файл можно создать в среде Паскаль следующим образом:
Программа будет иметь следующий вид:
На этом уроке было рассмотрено, как использовать текстовые файлы для ввода и вывода данных в программе на языке Паскаль. На следующем уроке Вы узнаете, как использовать тип данных Bulean для представления данных логического типа. Следующий урок: Логический тип данных
Урок понравился? Отзывы и замечания можно оставить в форме для комментариев, расположенной в нижней части страницы.
Pascal: Занятие № 12 Часть1. Работа с файлами в паскале (текстовые файлы)
Работа с файлами в паскале
Виды файлов в зависимости от их описания и режимом работы
Описание файловых переменных:
Для связи файла в коде программы и действительного файла на внешнем носителе используется процедура ASSIGN :
где myfile — имя переменной (объявленной ранее в области var ), ассоциированной с файлом c:\text.txt — путь к реальному файлу Первый аргумент процедуры assign в паскаль — переменная, второй – путь к файлу на диске.
Для считывания из файла достаточно связать поток ввода с файлом:
Считывание строки
Считывание массива из N целых
Текстовые файлы в паскале: процедуры работы
Текстовый файл в Паскале — это совокупность строк произвольной длины, которые разделены между собой метками конца строки, а весь файл заканчивается меткой конца файла.
Возможные расширения файлов: *.txt, *.log, *.htm, *.html
Метод работы с текстовым файлом в Паскале предусматривает лишь последовательный доступ к каждой строке файла. Это означает, что начинать всегда возможно только с первой строки, затем проходя по каждой строке, дойти постепенно до необходимой. Т.е. можно сказать, что чтение (или запись) из файла (в файл) ведутся байт за байтом от начала к концу.
Предусмотрены два режима работы: режим для записи в файл информации и для чтения ее из файла. Одновременная запись и чтение запрещены.
Открытие файла (классический Pascal)
Допустим, мы в программе описали переменную для работы с текстовым файлом:
Рассмотрим дальнейшую последовательность работы с ним, и рассмотрим процедуры, необходимые для работы с текстовым файлом в Паскале:
процедура открытия существующего файла для чтения при последовательном доступе:
процедура открытия создаваемого файла для записи в него информации; если файл с таким именем уже существует, то информация в нем стирается:
1. Программа, которая читает текстовый файл proga 1. pas и выводит его на экран построчно. Файл proga1.pas должен существовать на диске в текущей папке (например, с исходным текстом данной программы).
VAR f : TEXT; s : STRING;
2. Та же программа, но с вывод текстового файла посимвольно.
VAR f : TEXT; c : CHAR;
WHILE Not EoLN(f) DO
3. Программа, которая читает из текстового файла Numbers.txt числа (в файле должны быть записаны только числовые константы и пробелы).
VAR f : TEXT; x : Real;
WHILE NOT SeekEOF(f) DO
4. Написать программу, которая копирует один текстовой файл в другой.
f 1, f 2 : text ; // входной и выходной файлы
while not EOF (f1) do
5. Усложним задачу. Необходимо сформировать новый (т.е. не существующий ранее) текстовый файл, а затем переписать из данного файла во второй только те строки, которые начинаются с буквы «А» или «а».
Пояснения: Задача разбивается на два этапа: первый – формирование первого файла; второй – чтение первого файла и формирование второго.
В завершении решения задачи – вывод на экран содержимого второго файла.
While not eof(f1) do
If (s[ 1 ]=’A’) or (s[ 1 ]=’a’) then
Writeln(‘Второй файл содержит строки:’);
While not eof(f2) do <пока не конец файла >
6. Пример программы, которая сортирует строчки исходного текстового файла в обратном порядке и записывает их в новый файл под именем namesort.txt.
SA:Array [0..100] of String[100];
Write (‘введите имя файла для сортировки строк ’);
While Not EOF(Fil) Do
For I:=N Downto 1 Do
Работа с типизированными файлами
7. Перепишем программу из примера №4, так что файлы будут копироваться побайтно.
type typefile = file of byte;
while not EOF (f1) do
read (f1, c); write (f2, c)
8. Написать программу, которая заносит в файл FILE123 вещественные числа (случайные), выводит файл на экран, определяет размер файла и выводит содержимое случайно выбранного элемента
В программе использованы новые функции и процедуры для прямого доступа при работе с типизированными файлами:
VAR f : FILE OF Real;
WRITELN(‘ Размер файла =’,
WRITELN (‘Запись номер ‘,
FilePos ( f ), ‘ содержит ‘, r :0:3);
Работа с бинарными (нетипизированными) файлами
(покажем варианты двух предыдущих программ, но с использованием бинарных типов файлов)
9. Вариант решения программы из примера №8 (укороченный)
В программе использованы новые специальные процедуры для открытия и чтения-записи при работе с бинарными файлами, т.к. чтение/запись выполняется блоками определенного размера:
Стандартная функция sizeof (переменная или тип) возвращает максимальный размер, занимаемый переменной или указанного в аргументе типа
WRITELN(‘ Размер файла =’,
WRITELN (‘Запись номер ‘, FilePos ( f ), ‘ содержит ‘, r :0:3);
10. Перепишем программу из примеров №4 и 7, посвященную копированию содержимого одного файла в другой (причем любого типа)
Чтение и запись в этом примере программы происходит блоками по 64000 байт, что может дать заметный выигрыш в скорости
X : array[1..64000] of byte;
Следующий пример посвящен записи в файлы таблиц (т.е.данных типа – запись разобранных в начале главы).
knigi:array[1..20] of Book;
writeln (‘ название год изд. наличие в библ’);
while writer=» do readln(writer);
if writer=’999′ then break;
while name=» do readln(name);
while bibl=» do readln(bibl);
write (‘С какого года нужны книги? ‘);
writeln (‘ название год изд. наличие в библ’);
repeat until keypressed;
При запуске программы компьютер предлагает ввести номер режима работы, а затем либо дает возможность ввести данные и записывает их в файл на диск, либо читает информацию о книгах из файла, выбирает и печатает на экране данные о книгах, изданных после введенного пользователем года.
Текстовые файлы связываются с файловыми переменными, принадлежащими стандартному типу TEXT. Текстовые файлы предназначены для хранения текстовой информации. Именно в такого типа файлах хранятся, например, исходные тексты программ. Компоненты (записи) текстового файла могут иметь переменную длину, что существенно влияет на характер работы с ними.
EOLN- последовательность кодов ASCII #13 (CR) и #10 (LF);
Для доступа к записям применяются процедуры READ, READLN, WRITE, WRITELN. Они отличаются возможностью обращения к ним с переменным числом фактических параметров, в качестве которых могут использоваться символы, строки и числа. Первым параметром в любой из перечисленных процедур может стоять файловая переменная. В этом случае осуществляется обращение к дисковому файлу или логическому устройству, связанному с переменной процедурой ASSIGN. Если файловая переменная не указана, происходит обращение к стандартным файлам INPUT к OUTPUT.
Обеспечивает ввод символов, строк и чисел. Формат обращения:
При вводе переменных типа STRING количество считанных процедурой и помещенных в строку символов равно максимальной длине строки, если только раньше не встретились символы CR или EOF. В этом случае сами символы CR и EOF в строку не помещаются. Если количество символов во входном потоке данных больше максимальной длины строки, «лишние» символы до конца строки отбрасываются,а новое обращение к READ возвращает пустую строку. Таким образом, процедура READ не в состоянии прочесть последовательность строк: первая строка будет прочитана нормально, а все последующие окажутся пустыми. Для ввода последовательности строк нужно использовать процедуру READLN (см. ниже).
При вводе числовых переменных процедура READ вначале выделяет подстроку во входном потоке по следующему правилу: все ведущие пробелы, символы табуляции и маркеры конца строк EOLN пропускаются; после выделения первого значащего символа, наоборот, любой из перечисленных символов или символ EOF служат признаком конца подстроки. Выделенная таким образом подстрока затем рассматривается как символьное представление числовой константы соответствующего типа и преобразуется во внутреннее представление, а полученное значение присваивается переменной. Если в подстроке был нарушен требуемый формат представления численной константы, возникает ошибка ввода-вывода. Если при пропуске ведущих пробелов встретился символ EOF, переменная получает значение 0. Отметим, что в Турбо Паскале не предусмотрен ввод шестнадцатеричных констант.
При использовании процедуры READ применительно к стандартному файлу INPUT, т.е. при вводе с клавиатуры, символьные строки запоминаются в буфере, который передается процедуре только после нажатия на клавишу Enter. Это позволяет редактировать данные при их вводе. Для редактирования используются следующие клавиши:
Максимальная длина буфера ввода при работе с клавиатурой составляет 127 символов. Ввод с клавиатуры по процедуре READ сопровождается эхо-повтором вводимых символов на экране ПК.
Процедура READ прекрасно приспособлена к вводу чисел. При обращении к ней за вводом очередного целого или вещественного числа процедура «перескакивает» маркеры конца строк, т.е. фактически весь файл рассматривается ею как одна длинная строка, содержащая текстовое представление чисел. В сочетании с проверкой конца файла функцией EOF процедура READ позволяет организовать простой ввбд массивов данных, например, так:
m : array [1..N] of real;
while not EOF(f) and (i (см. процедуру READ), что приведет к пропуску всех символов текущей строки вплоть до EOLN.
Если процедура используется для чтения с клавиатуры, нажатие на клавишу Enter отобразится на экране как последовательность CR + LF и курсор будет помещен в начало следующей строки, в то время как в процедуре READ эхо-повтором клавиши Enter является символ CR и курсор помещается в начало текущей строки.
Обеспечивает вывод информации в текстовый файл или передачу ее на логическое устройство. Формат обращения:
Любой элемент списка вывода может иметь форму
OutExpr [ : MinWidth [ : DecPlaces ] ]
Подпараметр DECPLACES задает количество десятичных знаков в дробной части вещественного числа. Он может использоваться только совместно с MINWIDTH и только по отношению к выводимому выражению одного из вещественных типов.
Если ширина поля вывода не указана, соответствующий параметр выводится вслед за предыдущим без какого-либо их разделения.
Символы и строки передаются выводному файлу без изменений, но снабжаются ведущими пробелами, если задана ширина поля вывода и эта ширина больше требуемой для вывода.
При выводе логических выражений в зависимости от их значения выводятся строки TRUE или FALSE. (Ввод логических констант процедурами READ или READLN не предусмотрен).
Вещественные числа выводятся в экспоненциальном формате, если не указан подпараметр DECPLACES, в противном случае выбирается формат представления числа с фиксированной точкой. Экспоненциальный формат представляет вещественное число в виде
s пробел для положительного и знак «-» для отрицательного чисел;
Е символ десятичного основания;
* знак «+» или «-» в зависимости от знака десятичного порядка числа.
Если подпараметр MINWIDTH опущен, принимается его значение по умолчанию (23). Если MINWIDTH меньше 10, считается, что он равен 10.
Если подпараметр DECPLACES равен нулю, ни дробная часть числа, ни десятичная точка не выводятся. При отрицательном значении DECPLACES этот параметр игнорируется и число выводится в экспоненциальном формате с учетом MINWIDTH. Если значение DECPLACES больше 18, принимается значение 18. Следует учесть, что при указании подпараметра DECPLACES вещественное число всегда будет выводиться в формате с фиксированной точкой и требуемым количеством знаков в дробной части, даже если значение подпараметра MINWIDTH окажется недостаточным для размещения целой части: в этом случае значение MINWIDTH автоматически увеличивается.
При выводе на экран в случае, когда длина выводимой последовательности символов превышает ширину экрана или созданного на нем окна, «лишние» символы переносятся на следующую экранную строку. При заполнении экрана или окна его содержимое сдвигается вверх на одну строку.
Процедура WRITELN. Эта процедура полностью идентична процедуре WRITE за исключением того, что выводимая строка символов завершается кодами CR и LF. При вызове WRITELN можно опускать параметр : в этом случае в файл передается маркер EOLN, что при выводе на экран приведет к переводу курсор» в начало следующей строки.
Логическая функция EOLN. Возвращает TRUE, если во входном текстовом файле достигнут маркер конца строки. Формат обращения:
Если параметр опущен, функция проверяет стандартный файл INPUT.
Логическая функция SEEKEOLN.
Пропускает все пробелы и знаки табуляции до маркера конца строки EOLN или до первого значащего символа и возвращает TRUE, если маркер обнаружен. Формат обращения:
Если параметр опущен, функция проверяет стандартный файл INPUT.
Логическая функция SEEKEOF.
Пропускает все пробелы, знаки табуляции и маркеры конца строки EOLN до маркера конца файла или до первого значащего символа и возвращает TRUE, если маркер обнаружен. Формат обращения:
Если параметр опущен, функция проверяет стандартный файл INPUT.