Что такое reset в паскале
Pascal | Лекция №9
Файлы. Файловые переменные
СОДЕРЖАНИЕ:
Организация доступа к файлам
С термином «файл» вам уже приходилось встречаться. Прежде всего, это понятие обычно связывают с информацией на устройствах внешней памяти. В Паскале понятии файла употребляется в двух смыслах:
В программе между этими объектами устанавливается связь. Вследствие этого все, что происходит в процессе выполнения программы с внутренним файлом, дублируется во внешнем файле. С элементами файла можно выполнять только две операции: читать из файла и записывать в файл.
Файловый тип переменной – это структурированный тип, представляющий собой совокупность однотипных элементов, количество которых заранее (до исполнения программы) не определено.
Для работы с файлом при описании переменных необходимо определить переменную файлового типа, которая будет считаться «представителем» этого файла в данной программе. Такая переменная называется также указателем. Структура описания файловой переменной:
В качестве базового типа можно использовать любой тип, за исключением типа 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 в противном случае.
Процедуры:
Контрольные вопросы
Что такое reset в паскале
Здесь мы познакомимся с операциями, подготавливающие и завершающие работу с файлами.
Данные операции устанавливают/разрывают связь между файлом и программой, использующей этот файл, а также делают доступными программе элементы файла (открывают файл). Перечислим эти операции.
1. Процедура Assign служит для установления связи между файлом и файловой переменной. Может оказаться, что в программе нужно организовать работу одновременно с несколькими файлами. Естественно, в этом случае описываются несколько файловых переменных. Установкой соответствия между файлом и файловой переменной как раз «занимается» данная процедура. Ее общий вид:
2. Процедура Reset открывает файл для работы, то есть элементы файла становятся доступными программе. После выполнения процедуры Assign программа не может обращаться к элементам файла: они для нее еще «закрыты». Для «открытия» файлов как раз используется указанная процедура. Ее общий вид:
Например, после выполнения конструкции Reset (k); открывается файл PR.DAT (с учетом результата выполнения процедуры Assign ).
3. Процедура Rewrite также открывает файл для работы (для чтения/записи элементов). Зачем еще одна аналогичная процедура? Чем она отличается от предыдущей?
Например, после выполнения конструкции Rewrite (k); пересоздаётся файл PR.DAT (с учетом результата выполнения процедуры Assign ).
4. Процедура Close предназначена для закрытия файлов, то есть она «запирает» файл, и его элементы становятся недоступными программе. Общий вид этой процедуры:
Например, после выполнения процедуры Close(k); элементы файла PR.DAT становятся недоступными программе.
На следующем шаге после изучения процедур ввода/вывода информации мы продемонстрируем использование рассмотренных на этом шаге процедур.
Файлы в Паскале. Общие сведения. Текстовые файлы
В язык Паскаль выделяются данные файлового типа, которые служат для работы с информацией, расположенной на внешних устройствах. Эта информация формируется во внешней памяти компьютера, образуя некоторую область, называемую файлом. Файлы имеют имя и представляют собой совокупность однотипных элементов. Обычно они применяются, в случаях большого объема данных, долгосрочного хранения, либо необходимости предоставления доступа нескольким приложениям к одной и той же информации.
Файлы принято разделять на физические и логические. Физические файлы имеют имя, и располагаются на съемном носителе, а логические это те переменные файлового типа, которые их представляют в программе.
В Паскале различают следующие три вида файлов (в скобках описаны ключевые слова для инициализации файловой переменной):
текстовые файлы (text);
типизированные (file of );
Немного позже мы разберемся с каждым из них. А сейчас рассмотрим основные операции для работы с файлами.
Создание файла
Процедура Assign связывает переменную файлового типа с физическим файлом. Например, установить соответствие между переменной Fil и текстовым файлом lot, расположенном на диске D, можно так:
Режим чтения
Конец файла
Количество элементов в файле заранее не определяется, но часто необходимо знать о моменте достижения конца файла. Для этого в Паскале существует логическая функция EOF, которая проверяет достигнут ли конец, и если это так, то принимает значение True, иначе – False. Осуществляется проверка, как правило, в цикле, в качестве условного выражения выступает функция EOF.
Режим записи
Закрытие файла
Процедура Close закрывает открытый файл, а также освобождает файловую переменную, указанную в качестве параметра.
Удаление файла
При помощи процедуры Erase, можно удалить с внешнего носителя, заранее закрытый файл.
Изменение имени файла
Rеnаmе переименовывает физический файл, который перед этим следует закрыть процедурой Close.
Смещение указателя файла
Процедура Sееk устанавливает позицию указателя в файле на необходимый элемент (нумерация элементов начинается с нуля).
Определение положения указателя
Функция FilePos принимает значение порядкового номера элемента, над которым в момент вызова находиться указатель.
Определение количества элементов
Функция FileSize определяет количество всех имеющихся в файле элементов.
Текстовые файлы
Текстовые файлы могут состоять из элементов символьного (char) и строкового (string) типа данных. Ключевое слово Text указывает, что файловая переменная создается для работы именно с текстовым файлом:
Структура текстового файла представляет собой последовательность строк, которые в свою очередь состоят из символов. Любая строка оканчивается признаком «конца строки», а сам файл признаком «конца файла». Для определения конца файла в Паскаль есть функция EOF, а для конца строки – EOLn:
В случае достижения конца строки она (функция EOLn) принимает значение True, в противном случае False.
Рассмотрим работу с текстовым файлом, на примере программы.
Место создания файла «file.txt» не было указано, поэтому он создаться в папке по умолчанию для вашей среды программирования.
Для текстовых файлов в Паскале определены следующие процедуры и функции:
Процедура Append открывает существующий файл в режиме дозаписи. После чего в его конец можно добавить какую либо информацию.
Если до конца строки остались пробелы/знаки табуляции, то функция SeekEOLn возвращает значение True, иначе False.
Если до конца файла остались лишь строки с пробелами/знаками табуляции, то функция SeekEOF возвращает значение True, иначе False.
Pascal-Паскаль
Программирование. Файлы Pascal-Паскаль
Программирование. Файлы Pascal-Паскаль
Файлы Pascal-Паскаль
Существенной особенностью всех рассмотренных до сих пор значений производных типов является наличие в них конечного, наперед заданного числа компонент. Так, в значении многомерного массива это число можно определить, зная количество компонент по каждому измерению, а в значении записи это число определяется количеством и типом полей. Таким образом, заранее, еще до выполнения программы, по этому описанию можно выделить необходимый объем памяти машины для хранения значений переменных этих типов. Но существует определенный класс задач и определенные ситуации, когда количество компонент (пусть даже одного и того же из известных уже типов) заранее определить невозможно, оно выясняется только в процессе решения задачи. Поэтому возникает необходимость в специальном типе значений, которые представляют собой произвольные последовательности элементов одного и того же типа, причем длина этих последовательностей заранее не определяется, а конкретизируется в процессе выполнения программы. Этот тип значений получил название файлового типа. Условно файл в Паскале можно изобразить как некоторую ленту, у которой есть начало, а конец не фиксируется. Элементы файла записываются на эту ленту последовательно друг за другом:
где F – имя файла, а F1, F2, F3, F4 – его элементы. Файл во многом напоминает магнитную ленту, начало которой заполнено записями, а конец пока свободен. В программировании существует несколько разновидностей файлов, отличающихся методом доступа к его компонентам:файлы последовательного доступа и файлы произвольного доступа.
Простейший метод доступа состоит в том, что по файлу можно двигаться только последовательно, начиная с первого его элемента, и, кроме этого, всегда существует возможность начать просмотр файла с его начала. Таким образом, чтобы добраться до пятого элемента файла, необходимо, начав с первого элемента, пройти через предыдущие четыре. Такие файлы называют файлами последовательного доступа. У последовательного файла доступен всегда лишь очередной элемент. Если в процессе решения задачи необходим какой-либо из предыдущих элементов, то необходимо вернуться в начало файла и последовательно пройти все его элементы до нужного.
Файлы произвольного доступа Паскаля позволяют вызывать компоненты в любом порядке по их номеру.
Важной особенностью файлов является то, что данные, содержащиеся в файле, переносятся на внешние носители. Файловый тип Паскаля – это единственный тип значений, посредством которого данные, обрабатываемые программой, могут быть получены извне, а результаты могут быть переданы во внешний мир. Это единственный тип значений, который связывает программу с внешними устройствами ЭВМ.
Работа с файлами в Паскале
Любой файл имеет три характерные особенности. Во-первых, у него есть имя, что дает возможность программе работать одновременно с несколькими файлами. Во-вторых, он содержит компоненты одного типа. Типом компонентов может быть любой тип Паскаля, кроме файлов. Иными словами, нельзя создать «файл файлов». В-третьих, длина вновь создаваемого файла никак не оговаривается при его объявлении и ограничивается только емкостью устройств внешней памяти.
Файловый тип или переменную файлового типа в Паскале можно задать одним из трех способов:
Здесь – имя файлового типа (правильный идентификатор); File, of – зарезервированные слова (файл, из); – любой тип Паскаля, кроме файлов.
Пример описания файлового типа в Паскале
В зависимости от способа объявления можно выделить три вида файлов Паскаля:
Следует помнить, что физические файлы на магнитных дисках и переменные файлового типа в программе на Паскале – объекты различные. Переменные файлового типа в Паскале могут соответствовать не только физическим файлам, но и логическим устройствам, связанным с вводом/выводом информации. Например, клавиатуре и экрану соответствуют файлы со стандартными именами Input, Output.
Как известно, каждый тип данных в Паскале, вообще говоря, определяет множество значений и множество операций над значениями этого типа. Однако над значениями файлового типа Паскаля не определены какие-либо операции, в том числе операции отношения и присваивания, так что даже такое простое действие, как присваивание значения одной файловой переменной другой файловой переменной, имеющей тот же самый тип, запрещено. Все операции могут производиться лишь с элементами (компонентами) файлов. Естественно, что множество операций над компонентами файла определяется типом компонент.
Переменные файлового типа используются в программе только в качестве параметров собственных и стандартных процедур и функций.
Основные процедуры и функции для работы с файлами
1.До начала работы с файлами в Паскале необходимо установить связь между файловой переменной и именем физического дискового файла:
Следует помнить, что имя дискового файла при необходимости должно содержать путь доступа к этому файлу, включая имя дисковода. При этом имя дискового файла – строковая величина, т.е. должна быть заключена в апострофы. Например:
Пример процедуры Assign в Паскале
Если путь не указан, то программа будет искать файл в своем рабочем каталоге и по указанным путям в autoexec.bat.
Вместо имени дискового файла можно указать имя логического устройства, каждое из которых имеет стандартное имя:
CON – консоль, т.е. клавиатура-дисплей;
PRN – принтер. Если к компьютеру подключено несколько принтеров, доступ к ним осуществляется по именам LPT1, LPT2, LPT3.
Не разрешается связывать с одним физическим файлом более одной файловой переменной.
2.После окончания работы с файлами на Паскале, они должны быть закрыты.
При выполнении этой процедуры закрываются соответствующие физические файлы и фиксируются сделанные изменения. Следует иметь в виду, что при выполнении процедуры close связь файловой переменной с именем дискового файла, установленная ранее процедурой assign, сохраняется, следовательно, файл можно повторно открыть без дополнительного использования процедуры assign.
Работа с файлами заключается, в основном, в записи элементов в файл и считывании их из файла. Для удобства описания этих процедур введем понятие указателя, который определяет позицию доступа, т.е. ту позицию файла, которая доступна для чтения (в режиме чтения), либо для записи (в режиме записи). Позиция файла, следующая за последней компонентой файла (или первая позиция пустого файла) помечается специальным маркером, который отличается от любых компонент файла. Благодаря этому маркеру определяется конец файла.
3.Подготовка к записи в файл Паскаля
Процедура Rewrite(f) (где f – имя файловой переменной) устанавливает файл с именем f в начальное состояние режима записи, в результате чего указатель устанавливается на первую позицию файла. Если ранее в этот файл были записаны какие-либо элементы, то они становятся недоступными. Результат выполнения процедуры rewrite(f); выглядит следующим образом:
4.Запись в файл Паскаля
При выполнении процедуры write(f, x) в ту позицию, на которую показывает указатель, записывается очередная компонента, после чего указатель смещается на следующую позицию. Естественно, тип выражения х должен совпадать с типом компонент файла. Результат действия процедуры write(f, x) можно изобразить так:
Состояние файла f до выполнения процедуры
Состояние файла f после выполнения процедуры
Для типизированных файлов выполняется следующее утверждение: если в списке записи перечислено несколько выражений, то они записываются в файл, начиная с первой доступной позиции, а указатель смещается на число позиций, равное числу записываемых выражений.
5.Подготовка файла к чтению Паскаля
Эта процедура ищет на диске уже существующий файл и переводит его в режим чтения, устанавливая указатель на первую позицию файла. Результат выполнения этой процедуры можно изобразить следующим образом:
Если происходит попытка открыть для чтения не существующий еще на диске файл, то возникает ошибка ввода/вывода, и выполнение программы будет прервано.
6.Чтение из файла в Паскале
Рассмотрим результат действия процедуры read(f, v):
Состояние файла f и переменной v до выполнения процедуры:
Состояние файла f и переменной v после выполнения процедуры:
Для типизированных файлов при выполнении процедуры read() последовательно считывается, начиная с текущей позиции указателя, число компонент файла, соответствующее числу переменных в списке, а указатель смещается на это число позиций.
В большинстве задач, в которых используются файлы, необходимо последовательно перебрать компоненты и произвести их обработку. В таком случае необходимо иметь возможность определять, указывает ли указатель на какую-то компоненту файла, или он уже вышел за пределы файла и указывает на маркер конца файла.
7.Функция определения достижения конца файла в Паскале
Название этой функции является сложносокращенным словом от end of file. Значение этой функции имеет значение true, если конец файла уже достигнут, т.е. указатель стоит на позиции, следующей за последней компонентой файла. В противном случае значение функции – false.
8.Изменение имени файла в Паскале
Здесь новое_ имя_ файла – строковое выражение, содержащее новое имя файла, возможно с указанием пути доступа к нему.
Перед выполнением этой процедуры необходимо закрыть файл, если он ранее был открыт.
9.Уничтожение файла в Паскале
Перед выполнением этой процедуры необходимо закрыть файл, если он ранее был открыт.
10.Уничтожение части файла от текущей позиции указателя до конца в Паскале
11.Файл Паскаля может быть открыт для добавления записей в конец файла
Типизированные файлы Паскаля. Длина любого компонента типизированного файла строго постоянна, т.к. тип компонент определяется при описании, а, следовательно, определяется объем памяти, отводимый под каждую компоненту. Это дает возможность организовать прямой доступ к каждой компоненте (т.е. доступ по порядковому номеру).
Перед первым обращением к процедурам ввода/вывода указатель файла стоит в его начале и указывает на его первый компонент с номером 0. После каждого чтения или записи указатель сдвигается к следующему компоненту файла. Переменные и выражения в списках ввода и вывода в процедурах read() и write() должны иметь тот же тип, что и компоненты файла Паскаля. Если этих переменных или выражений в списке несколько, то указатель будет смещаться после каждой операции обмена данными на соответствующее число позиций.
Для облегчения перемещения указателя по файлу и доступа к компонентам типизированного файла существуют специальные процедуры и функции:
fileSize( ) – функция Паскаля, определяющая число компонентов в файле;
filePos( ) – функция Паскаля, значением которой является текущая позиция указателя;
Текстовые файлы Паскаля. Текстовые файлы предназначены для хранения текстовой информации. Именно в таких файлах хранятся, например, исходные тексты программ. Компоненты текстовых файлов могут иметь переменную длину, что существенно влияет на характер работы с ними. Доступ к каждой строке текстового файла Паскаля возможен лишь последовательно, начиная с первой. К текстовым файлам применимы процедуры assign, reset, rewrite, read, write и функция eof. Процедуры и функции seek, filepos, filesize к ним не применяются. При создании текстового файла в конце каждой записи (строки) ставится специальный признак EOLN(end of line – конец строки). Для определения достижения конца строки существует одноименная логическая функция EOLN( ), которая принимает значение true, если конец строки достигнут.
Форма обращения к процедурам write и read для текстовых и типизированных файлов одинакова, но их использование принципиально различается.
В списке записываемых в текстовый файл элементов могут чередоваться в произвольном порядке числовые, символьные, строковые выражения. При этом строковые и символьные элементы записываются непосредственно, а числовые из машинной формы автоматически преобразуются в строку символов.
Так, в типизированном файле числа 6, 65 и 165 как целые будут представлены одним и тем же числом байт. А в текстовых файлах, после преобразования в строку, они будут иметь разную длину. Это вызывает проблемы при расшифровке текстовых файлов. Пусть в текстовый файл пишутся подряд целые числа (типа byte): 2, 12, 2, 128. Тогда в файле образуется запись 2122128. При попытке прочитать из такого файла переменную типа byte программа прочитает всю строку и выдаст сообщение об ошибке, связанной с переполнением диапазона.
Но, вообще-то, такой файл не понимает не только машина, а и человек.
Чтобы избежать этой ошибки, достаточно вставить при записи в файл после каждой переменной пробел. Тогда программа при каждом чтении берет символы от пробела до пробела и правильно преобразует текстовое представление в число.
Кроме процедур read и write при работе с текстовыми файлами используются их разновидности readln и writeln. Отличие заключается в том, что процедура writeln после записи заданного списка записывает в файл специальный маркер конца строки. Этот признак воспринимается как переход к новой строке. Процедура readln после считывания заданного списка ищет в файле следующий признак конца строки и подготавливается к чтению с начала следующей строки.
Пример решения задачи с файлами Паскаля
Пусть нам необходимо сформировать текстовый файл с помощью Паскаля, а затем переписать из данного файла во второй только те строки, которые начинаются с буквы «А» или «а».
Пояснения: нам понадобятся две файловые переменные f1 и f2, поскольку оба файла текстовые, то тип переменных будет text. Задача разбивается на два этапа: первый – формирование первого файла; второй – чтение первого файла и формирование второго.
Для завершенности решения задачи есть смысл добавить еще одну часть, которая в задаче явно не указана – вывод на экран содержимого второго файла.