Какие отличия существуют в использовании процедуры reset при открытии различных типов файлов
После установления связи между файловой переменной и именем файла на диске нужно открыть файл, воспользовавшись процедурами reset или rewrite.
Процедура reset(f) (где f – имя файловой переменной) открывает файл, связанный с файловой переменной f, после чего становится доступным для чтения первый элемент, хранящийся в файле. Далее можно выполнять чтение и запись данных из файла.
Процедура rewrite(f) создает пустой файл (месторасположение файла на диске определяется процедурой AssignFile) для последующей записи в него данных.
Внимание. Если файл, связанный с файловой переменной f, существовал на диске, то вся информация в нем уничтожается.
3. Закрытие файла - Close.
Операция закрытия файла является логическим окончанием работы с любым открытым файлом. Для этого служит процедура
CloseFile(f : file); for Delphi>
Использование процедуры Close позволяет устранить связь файловой переменной с внешним файлом,установленную с помощью процедуры Assign. Выражаясь языком операционной системы, можно сказать, что после обращения к процедуре Close выделенный для данного файла обработчик освобождается для других работ. Этим продиктовано требование обязательного закрытия файла после окончания работы с ним.
Пример. Полная цепочка команд для создания простого текстового файла с именем SVETA.TXT для Pascal:
Прежде чем приступить к выполнению индивидуальных заданий, ознакомьтесь с типами файлов, процедурами управления файловыми данными. Обратите внимание на процедуры, позволяющие оптимизировать процесс обработки файлов. Решение задач представить в следующем порядке: постановка задачи, построение математической модели, программный код, тестирование.
Задание для лабораторной работы выбрать согласно варианту по приведённой таблице. Вариант определяется порядковым номером в журнале группы.
Общие сведения.
1. Классификация файлов. В программе существует три класса файлов - типизированные, бестиповые и текстовые, - которые позволяют считывать большие объемы данных непосредственно с диска, не вводя их с клавиатуры.
Текстовыминазывают файлы, состоящие из любых символов. Они организуются по строкам, каждая из которых заканчивается символом «конец строки». Конец самого файла обозначается символом «конец файла». При записи информации в текстовый файл, просмотреть который можно с помощью любого текстового редактора, все данные преобразуются в символьный тип и хранятся в этом виде.
Файлы, состоящие из компонентов одного типа, число которых заранее не определено и может быть любым, называются типизированными.Они заканчиваются символом "конец файла», хранятся в двоичном виде и не просматриваются с помощью текстовых редакторов.
В бестиповых (нетипизированных)файлах информация считывается и записывается блоками определенного размера. В них могут храниться данные любого вида и структуры.
Описание файловых переменных.
Текстовый файл описывается с помощью служебного слова text.
var f: text;
Типизированные файлы могут описываться следующим образом:
var f: file of тип;
Предварительно можно определить новый тип данных:
Type имя = file of тип;
Бестиповый файл описывается с помощью служебного слова file:
var имя: file;
Type
Massiv = array [1..25] of real;
ff = file of real;
Var
c : file of integer;
d : file of massiv;
Обработка типизированных файлов.
Любой программе доступны два предварительно объявленных файла со стандартными файловыми переменными:
INPUT - для чтения данных с клавиатуры;
OUTPUT - для вывода на экран дисплея;
Любые другие файлы, а также логические устройства становятся доступны программе только после выполнения процедуры связывания файловой переменной с именем существующего или создаваемого файла и открытия его для чтения или записи.
Ниже рассмотрены процедуры и функции, которые используются для работы с типизированными файлами.
Процедура assign.
Для начала работы с файлами необходимо связать файловую переменную в программе с файлом на диске. Для этого используется процедура assign (f, s), где f – имя файловой переменной, а s – полное имя файла на диске (файл должен находиться в текущем каталоге при условии, что к нему специально не указывается путь).
Var
f: file of real;
Begin
assign (f, ‘ d: \ tp\ tmp\ abc.dat’);
Процедуры reset, rewrite.
В Паскале в случае использования типизированных файлов можно открыть файл для чтения и записи одновременно.
После установления связи между файловой переменной и именем файла на диске нужно открыть файл, воспользовавшись процедурами reset или rewrite.
Когда будет выполнена процедура reset(f), где f -имя файловой переменной, файл будет открыт для чтения и станет доступен его первый элемент. В результате этой процедуры специальная переменная - указатель, связанная с этим файлом, будет указывать на начало файла, т.е. на компонент с порядковым номером 0. Если в процессе выполнения программы делается попытка открыть для чтения не существующий файл, то возникает ошибка, которая может быть проанализирована с помощью встроенной функции IOREZULT типа Word. В случае отсутствия файла, открываемого для чтения значение этой функции не равно 0.
Далее можно выполнять чтение и запись информации из файла. Под чтением файла понимается ввод данных из внешнего файла, находящегося на диске, в оперативную память машины. Данные внешнего файла становятся доступными программе.
Файл можно открыть для записи и очистить при помощи процедуры rewrite (f), где f -имя файловой переменной. Она открывает и очищает файл (то есть удаляет из него информацию), после чего его можно использовать для записи. Под записью файла понимается вывод результатов программы из оперативной памяти ЭВМ на диск, т. е. создание нового файла на внешнем устройстве.
Процедура close.
Процедура close(f), где f - имя файловой переменной, закрывает файл, который ранее был открыт процедурами reset, rewrite. Именно ее следует использовать при закрытии файла, в который была записана информация. Дело в том, что writе не обращается непосредственно к диску, а пишет информацию в специальный участок памяти, называемый буфером файла. После того как буфер заполнится, вся информация из него вносится в файл. При выполнении операции close сначала происходит запись буфера файла на диск, и только потом файл закрывается. Если его не закрыть вручную, то это произойдет автоматически при завершении работы программы, однако пропадет информация, хранимая в буфере файла.
Переменные файлового типа используются в программе только в качестве параметров собственных и стандартных процедур и функций. Все фактические действия с файлами основаны на наборе стандартных процедур языка, входящих в состав модулей System и Dos.
До начала работы с файлами устанавливается связь файловой переменной МуFilе с именем дискового файла. Очень важно различать собственно файл (область памяти на магнитном носителе с некоторой информацией) и переменную файлового типа в Turbo Pascal-программе. Считается, что файловая переменная является представителем некоторого дискового файла в программе. Для того, чтобы реализовать доступ к файлу на магнитном диске, программа должна связать его с файловой переменной. Для этого необходимо установить соответствие между переменной и именем файла. Это имя представляется в виде строки, содержащей имя файла и, может быть, путь к файлу, который формируется по общим правилам MS-DOS.
assign (МуFilе, 'с:\МуDirectory\Result.dat'); |
здесь приведено полное (с указанием пути) имя пользовательского файла Result.dat.
Если путь не указан, программа будет искать файл только в своем рабочем каталоге. Кроме указания имени файла на дисковом накопителе может быть указано стандартное имя одного из устройств ввода-вывода: «соn» - консоль, то есть дисплей и клавиатура, «рrn» - или «lpt1» - принтер.
Не разрешается связывать с одним физическим файлом разные файловые переменные программы.
До тех пор, пока файловая переменная не связана с каким-либо дисковым файлом, никакие операции с ней в программе невозможны. Заметим, что можно связать файловую переменную с еще не существующим дисковым файлом. Это делается в случае последующего создания Turbo Pascal-программой файла с данным именем с помощью специальной системной процедуры.
После того, как файловая переменная с помощью процедуры Аssign связана с конкретным дисковым файлом, с ним можно выполнить любую допустимую операцию.
Внимание! Нельзя применять процедуру assign к открытому файлу.
Все файлы, открытые в результате работы программы, должны быть закрыты при завершении программы процедурой
При выполнении этого оператора закрывается физический файл на диске, и фиксируются изменения, связанные с использованием данного файла. Обратите внимание на необходимость закрытия файлов во всех ветвях программы, в том числе в различных аварийных ситуациях. Незакрытые файлы нарушают файловую структуру на диске, что может приводить к серьезным проблемам с настройкой компьютера.
Открытие нового файла производится процедурой, единственный аргумент которой - переменная файлового типа, например:
rewrite (МуFilе); |
Эта процедура создает на диске файл с именем, связанным с переменной МуFilе процедурой Аssign. Указатель работы с файлом устанавливается на начало файла. После выполнения процедуры rewrite файл доступен как для записи, так и для чтения (в случае текстовых файлов – только для записи).
Внимание! Если файл с таким именем уже существует, он удаляется (его содержимое теряется), и создается новый пустой файл с данным именем.
Открытие существующего файла выполняет процедура
Эта процедура ищет уже существующий файл на диске и открывает его для работы, помещая указатель в начальную позицию. Если файл с установленным в Аssign именем не найден, возникает ошибка ввода/вывода, контроль которой зависит от директивы компилятора . После выполнения процедуры reset файл доступен как для записи, так и для чтения (в случае текстовых файлов – только для чтения).
Запись в файл производится процедурой
write (МуFilе, var1, var2, . varN); |
Первый аргумент этой процедуры - переменная файлового типа, далее следует список записываемых переменных, которые должны соответствовать объявленному типу файла. При выполнении этой операции текущий указатель файла смещается на число позиций, равное числу переменных.
Чтение из файла производится аналогичной процедурой:
read (МуFilе, var1, var2, . varN); |
Положение элементов в файле нумеруется, начиная с номера 0 для первого элемента. После последнего элемента файла автоматически записывается признак конца файла.
Функция FileSize(МуFilе) определяет число элементов в файле. Функция неприменима к текстовым файлам. Файл MyFyle должен быть открыт.
Функция логического типа ЕОF(МуFilе) имеет значение Тruе, если указатель указывает на маркер конца файла (End Of File).
Типизированные файлы
Определение. Типизированный файл - последовательность элементов одного типа.
Таким образом, типизированный файл Вы можете представить себе как цепочку однотипных данных. Все компоненты файла имеют общее имя, а каждый – еще и свой номер. Начальный элемент имеет нулевой номер. Длина файла, то есть количество элементов в цепочке - величина произвольная, изменяемая в процессе работы. После последнего элемента автоматически записывается признак конца файла.
Описание файлового типа для работы с типизированным файлом имеет синтаксис:
Допустим, мы имеем дело с файлом, в котором записываются переменные типа Word, тогда переменная файлового типа может быть введена двояко – с явным объявлением файлового типа:
Type WordFile = file of word; Var MyFile : WordFile; |
или без объявления файлового типа:
Var MyFile : file of word; |
Приведем примеры переменных файлового типа с другими объявлениями:
Type Student = record Name, SurName : string; YearsOld : byte; Sessia : array [1..10] of byte; end; Var VarFile1 : file of char; VarFile2 : file of Student; VarFile3 : file of string; |
Напомним, что файловые переменные имеют специфическое применение: их можно использовать только для выполнения операций с файлами (чтения, записи, удаления файла и т.д.) и получения информации о конкретном файле (тип, параметры, имя файла и т.д.).
Работа с файлами заключается в записи и считывании его компонентов. Для того, чтобы определить, какие данные будут участвовать в операции, используется неявно заданная переменная – указатель на текущий элемент файла. При открытии файла процедурами reset, rewrite указатель устанавливается на его начало. Запись и чтение производятся поэлементно, причем в них участвует тот элемент файла, на который "смотрит" указатель. В результате выполнения действия указатель перемещается к следующему элементу.
Пример. Приведем шаблон программы для записи данных в типизированный файл.
Program Writing; Var FileName : string; FVar : file of byte; Index : byte; Begin write ('Введите имя файла '); readln (FileName); assign (FVar, FileName); rewrite (FVar); for Index := 0 to 99 do write (FVar,Index); close (FVar); End. |
Примечание. В цикле могут быть вычислительные процедуры для получения данных, выводимых в файл. Мы, для простоты, записали в файл счетчик цикла.
Внимание! Следует запомнить, что процедура rewrite очистит файл, если файл с таким именем уже есть в рабочем каталоге, поэтому при выборе имен файлов соблюдайте осторожность.
Процедура erase
Удаление файла, связанного с переменной f, выполняется посредством процедуры erase(f), в которой f также является именем файловой переменной. Для корректного выполнения этой операции файл должен быть закрыт.
3. Закрытие файла - Close.
Операция закрытия файла является логическим окончанием работы с любым открытым файлом. Для этого служит процедура
CloseFile(f : file); for Delphi>
Использование процедуры Close позволяет устранить связь файловой переменной с внешним файлом,установленную с помощью процедуры Assign. Выражаясь языком операционной системы, можно сказать, что после обращения к процедуре Close выделенный для данного файла обработчик освобождается для других работ. Этим продиктовано требование обязательного закрытия файла после окончания работы с ним.
Пример. Полная цепочка команд для создания простого текстового файла с именем SVETA.TXT для Pascal:
Для работы с файлом после его объявления прежде всего необходимо его открыть. В языке Паскаль предусмотрены для этого две процедуры:
Reset(f : file); - открывает существующий файл;
Rewrite(f : file); - создает и открывает новый файл.
При описании обеих процедур параметр означает файловую переменную любого типа. Открытие внешнего файла с помощью процедуры Reset в случае его отсутствия на диске может привести к ошибке при выполнении программы. Подобные ошибочные ситуации в операциях ввода-вывода позволяет отслеживать специальная функция IOresult.
Пример. Стандартное открытие файла.
Assign(f,’c:\TSS\TSS85\Vovchik.txt’);
Reset(f);
В Pascal При назначении файловой переменной пустой строки происходит автоматическая ссылка на стандартный файл ввода, что в модуле System соответствует устройству con.С открытием такого файла появляется возможность ввода данных с клавиатуры.
Операционная система устанавливает каждому открываемому файлу так называемый обработчик файлов с определенным номером. Этот обработчик осуществляет операции обмена данными через буфер ввода-вывода. Определение таких обработчиков и их количество на сеанс работы устанавливается при загрузке операционной системы с помощью специальной команды , включенной в файл конфигурации CONFIG.SYS. Например, команда files = 15 в файле config.sys задает возможность одновременной работы с 15 пользовательскими файлами, определяет соответствующее количество обработчиков файлов и резервирует для этого необходимые ресурсы.
Имеются некоторые отличия в использовании процедуры Reset при открытии различных типов файлов. В отношении текстовых файлов (тип text) действие процедуры означает открытие файла только для чтения. Для нетипизированных файлов в описание процедуры добавляется еще один параметр RecSize типа word, который устанавливает длину записи для функций обмена с файлом. Процедура Reset для нетипизированного файла имеет вид:
Reset(f : file; RecSize : word);
Процедура Rewrite создает и открывает новый файл. Использование этой процедуры требует особого внимания. При попытке создать и открыть новый файл с именем уже существующего на диске набора данных действие процедуры Rewrite сведется к удалению этого набора и созданию нового пустого файла с тем же именем. На практике это приводит к потере информации. Реальный выход в таких ситуациях заключается в предварительном создании резервных копий тех файлов, над которыми могут производиться подобные критические действия.
Rewrite(f);
При открытии новых нетипизированных файлов для задания длины записи в описание процедуры Rewrite добавляется дополнительный параметр RecSize типа word. В этом случае процедура имеет вид:
Rewrite(f : file; RecSize : word);
Если процедура Rewrite используется для текстового файла, то к открываемому новому набору данных в дальнейшем могут быть применимы только операции записи.
Чтение и запись данных в файл
Для записи данных в файл можно использовать процедуру write:
write(f, x1, x2. xn);
f — имя файловой переменной,
x, x1, x2, . xn — имена переменных, значения из которых записываются в файл.
Тип компонентов файла обязательно должен совпадать с типом переменных. При выполнении процедуры write значения x1, x2, . xn последовательно записываются в файл (начиная с текущей позиции), связанный с файловой переменной f.
Для чтения информации из файла, связанного с файловой переменной f, можно воспользоваться процедурой read:
read(f, x1, x2, x3. xn);
f — имя файловой переменной,
x, x1, x2, . xn — имена переменных, в которые считываются значения из файла.
Процедура read последовательно считывает компоненты из файла, связанного с файловой переменной f, в переменные x1, x2, . xn. При считывании очередного значения доступным становится следующее. Следует помнить, что процедура read не проверяет, достигнут ли конец файла. За этим нужно следить с помощью функции eof.
Для работы с файлом после его объявления прежде всего необходимо его открыть. В языке Паскаль предусмотрены для этого две процедуры:
Reset(f : file); - открывает существующий файл;
Rewrite(f : file); - создает и открывает новый файл.
При описании обеих процедур параметр означает файловую переменную любого типа. Открытие внешнего файла с помощью процедуры Reset в случае его отсутствия на диске может привести к ошибке при выполнении программы. Подобные ошибочные ситуации в операциях ввода-вывода позволяет отслеживать специальная функция IOresult.
Пример. Стандартное открытие файла.
Assign(f,’c:\TSS\TSS85\Vovchik.txt’);
Reset(f);
В Pascal При назначении файловой переменной пустой строки происходит автоматическая ссылка на стандартный файл ввода, что в модуле System соответствует устройству con.С открытием такого файла появляется возможность ввода данных с клавиатуры.
Операционная система устанавливает каждому открываемому файлу так называемый обработчик файлов с определенным номером. Этот обработчик осуществляет операции обмена данными через буфер ввода-вывода. Определение таких обработчиков и их количество на сеанс работы устанавливается при загрузке операционной системы с помощью специальной команды , включенной в файл конфигурации CONFIG.SYS. Например, команда files = 15 в файле config.sys задает возможность одновременной работы с 15 пользовательскими файлами, определяет соответствующее количество обработчиков файлов и резервирует для этого необходимые ресурсы.
Имеются некоторые отличия в использовании процедуры Reset при открытии различных типов файлов. В отношении текстовых файлов (тип text) действие процедуры означает открытие файла только для чтения. Для нетипизированных файлов в описание процедуры добавляется еще один параметр RecSize типа word, который устанавливает длину записи для функций обмена с файлом. Процедура Reset для нетипизированного файла имеет вид:
Reset(f : file; RecSize : word);
Процедура Rewrite создает и открывает новый файл. Использование этой процедуры требует особого внимания. При попытке создать и открыть новый файл с именем уже существующего на диске набора данных действие процедуры Rewrite сведется к удалению этого набора и созданию нового пустого файла с тем же именем. На практике это приводит к потере информации. Реальный выход в таких ситуациях заключается в предварительном создании резервных копий тех файлов, над которыми могут производиться подобные критические действия.
Rewrite(f);
При открытии новых нетипизированных файлов для задания длины записи в описание процедуры Rewrite добавляется дополнительный параметр RecSize типа word. В этом случае процедура имеет вид:
Rewrite(f : file; RecSize : word);
Если процедура Rewrite используется для текстового файла, то к открываемому новому набору данных в дальнейшем могут быть применимы только операции записи.
Функция eof
Функция eof(f) (end of file), где f – имя файловой переменной, принимает значение «истина» (true), если достигнут конец файла, иначе – «ложь» (false). С помощью этой функции можно проверять, достигнут ли конец файла и можно ли считывать очередную порцию данных.
Процедура СloseFile
Процедура CloseFile(f), где f – имя файловой переменной, закрывает файл, который ранее был открыт процедурами rewrite, reset.
Процедуру CloseFile(f) следует обязательно использовать при закрытии файла, в который происходила запись данных.
Дело в том, что процедуры записи в файл не обращаются непосредственно к диску, они пишут информацию в специальный участок памяти, называемый буфером файла. После того как буфер заполнится, вся информация из него переносится в файл. При выполнении процедуры closefile сначала происходит запись буфера файла на диск, и только потом файл закрывается. Если его не закрыть вручную, то закрытие произойдет автоматически при завершении работы программы. Однако при автоматическом закрытии файла информация из буфера файла не переносится на диск, и как следствие часть информации может пропасть.
Внимание. После записи информации в файл его обязательно закрывать с помощью процедуры CloseFile. Однако при чтении данных из файла нет необходимости в обязательном его закрытии.
Процедура rename
Переименование файла, связанного с файловой переменной f, осуществляется в то время, когда он закрыт, при помощи процедуры rename(f,s), где f – файловая переменная, s – новое имя файла (строковая переменная).
Читайте также: