Какие отличия существуют в использовании процедуры reset при открытии различных типов файлов

Обновлено: 06.07.2024

Нетипизированные файлы - это файлы, поддержка которых осуществляется с максимально возможной скоростью. Введение таких файлов в систему Турбо Паскаль было вызвано стремлением повысить эффективность программ, участвующих в интенсивном обмене с внешними наборами данных.

Эти файлы в отличие от уже рассмотренных не имеют строго определенного типа.

Нетипизированный файл рассматривается в Паскале как совокупность символов или байтов. Представление char или byte не играет никакой роли, важен лишь объем занимаемых данных.

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

Для определения в программе нетипизированного файла служит зарезервированное слово file:

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

Нетипизированный файл является файлом прямого доступа, что говорит о возможности одновременного использования операций чтения и записи.

Для таких файлов самым важным параметром является длина записи в байтах. Открытие нетипизированного файла с длиной записи в 1 байт можно выполнить следующим образом:

rewrite(MyFile, 1) или reset(MyFile, 1)

Второй параметр, предназначенный только для использования с нетипизированными файлами, задает длину записи файла на сеанс работы.

Особенность аппаратной поддержки заключается в том, что при обращении к внешнему устройству минимально возможным объемом для считывания являются 128 байт. В стремлении добиться наибольшей эффективности файловых операций в Турбо Паскале принято соглашение, по которому длина записи нетипизированного файла по умолчанию составляет 128 байт. Поэтому после открытия файла с помощью вызовов:

rewrite(MyFile) или reset(MyFile)

все процедуры и функции, обслуживающие файлы прямого доступа, работают с записями длиной 128 байт. Каждый пользователь для своих программ может выбрать наиболее подходящий размер записи.

Турбо Паскаль не накладывает каких-либо ограничений на длину записи нетипизированного файла, за исключением требования положительности и ограничения максимальной длины 65535 байтами (емкость целого типа word). При этом следует учитывать два обстоятельства.

Во-первых, для обеспечения максимальной скорости обмена данными следует задавать длину, которая была бы кратна длине физического сектора дискового носителя информации (512 байт).

С другой стороны, нужно помнить, что общий размер файла может не быть кратен выбранному размеру записи (последняя запись может быть неполной). Для того, чтобы гарантированно обеспечить полное чтение всего файла, рекомендуется установить размер записи равным 1.

Более того, фактически пространство на диске выделяется любому файлу порциями - кластерами, которые в зависимости от типа диска могут занимать 2 и более смежных секторов. Как правило, кластер может быть прочитан или записан за один оборот диска, поэтому наивысшую скорость обмена данными можно получить, если указать длину записи, равную длине кластера.

При работе с нетипизированными файлами могут применяться все процедуры и функции, доступные типизированным файлам. Напомним эти процедуры и функции.

assign (МуFilе, 'с:\МуDirectory\result.dat') - процедура связывания логической файловой переменной МуFilе с конкретным физическим файлом на дисковом носителе информации;

closе (МуFilе) - процедура, закрывающая открытый файл;

rewrite (МуFilе) - процедура, создающая новый файл и открывающая его для записи или чтения; эта процедура имеет дополнительный параметр при работе с нетипизированными файлами, который будет рассмотрен позднее;

reset (МуFilе) - процедура, открывающая существующий файл данных; эта процедура имеет дополнительный параметр при работе с нетипизированными файлами, который будет рассмотрен позднее;

eof (МуFilе) - логическая функция, проверяющая, достигнут ли конец файла;

seek (МуFilе, n) - процедура, позволяющая явно изменить значение текущего указателя файла, установив его на элемент с номером n;

filesize(МуFilе) - функция, возвращающая позицию указателя по файлу; нумерация начинается с нуля;

filepos (МуFilе) - функция, возвращающая количество элементов файла;

rename(МуFilе, FileName) - процедура, позволяющая переименовать существующий файл;

truncate(МуFilе) - процедура, позволяющая удалить часть существующего файла, начиная с текущей позиции;

erase(МуFilе) - процедура, стирающая указанный файл,

Вы должны были заметить, что в списке нет процедур read и write. Для чтения информации из нетипизированного файла и записи информации в него только для данного типа файлов в Турбо Паскаль введены две новые процедуры, поддерживающие операции ввода-вывода с более высокой скоростью.

Процедура считывает из файла F определенное число блоков в память, начиная с первого байта переменной Buf.

Параметр Buf представляет любую переменную, которая будет участвовать в обмене данными с дисками. Эту переменную нужно описать в программе так, чтобы ее размер не был меньше размера записи, установленного в параметрах rewrite или reset (как правило, для этих целей используется некоторый массив).

Параметр Kolblocks задает число считываемых блоков, которые должны быть прочитаны за одно обращение к диску.

Параметр result является необязательным и содержит после вызова процедуры число действительно считанных записей.

Использование параметра result подсказывает, что число считанных блоков может быть меньше, чем задано параметром Kolblocks. Если result указан при вызове, то ошибки ввода-вывода в такой ситуации не произойдет. Для отслеживания этой и других ошибок чтения можно использовать опции , и функцию IOresult.

Кроме того, что переменная F должна быть описана как нетипизированный файл, она должна быть связана с конкретным физическим диском процедурой assign. Файл должен быть открыт процедурой reset.

Процедура предназначена для быстрой передачи в файл F определенного числа записей из переменной Buf. Все параметры процедуры blockwrite аналогичны параметрам процедуры blockread. Разница лишь в том, что файл должне быть подготовлен для записи процедурой rewrite. Содержимое переменной Buf целиком помещается в файл, начиная с текущей записи.

Обе процедуры выполняют операции ввода-вывода блоками. Объем блока в байтах определяется по формуле:

Объем = Kolblocks * recSize,

где recSize - размер записи файла, заданный при его открытии. Суммарный объем разового обмена не должен превышать 64 Кбайт. Помимо скорости передачи данных преимущество этих процедур заключается в возможности пользователя самостоятельно определять размер буфера для файловых операций. Эта возможность играет значительную роль в тех задачах, где необходимо жесткое планирование ресурсов. Программист должен позаботиться о том, чтобы длина внутреннего представления переменной Buf была достаточной для размещения всех байт при чтении информации с диска.

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

Если при чтении указана переменная Buf недостаточной длины или если в процессе записи на диск не окажется нужного свободного пространства, то произойдет следующее. Если последний параметр result в этих вызовах не задан, то возникает ошибка ввода-вывода; если параметр result задан, то ошибка не будет зафиксирована, а после выполнения процедуры его значение не будет совпадать с значением параметра Kolblocks. Последнее обстоятельство можно проверить, сравнив два указанных значения.

После завершения процедуры указатель смещается на result записей.

Рассмотрите примеры простых задач.

Задача 1. Составить программу, которая создает нетипизированный файл из 100 чисел и выводит на экран k-ый элемент.

Задача 2. Составить программу, которая создает копию элементов нетипизированного файла f и помещает в файл g.

Задача 3. Составить программу, которая создает массив целых чисел и записывает его в нетипизированный файл, а также вычисляет среднее арифметическое элементов файла.

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

Для работы c файлом, прежде всего, необходимо его открыть. В Pascal для этого предусмотрены две процедуры:

Reset(var F : file ); F - открывает существующий файл;

Rewrite(var F : file ); F - создает и открывает новый файл.

При описании обеих процедур параметр File ибозначает файловую переменную любого типа. Открытие внешнего файла с помощью процедуры Reset в случае его отсутствия на диске может привести к Ошибке при выполнении программы. Подобные ошибочные ситуации в операциях ввода-1-ывода позволяет отслеживать специальная функция IOresult. Пример: Стандартное открытие файла.

При назначении файловой переменной пустой строки происходит автоматическая ссылка на стандартный файл ввода, что в модуле SYSTEM соответствует устройству CON. С открытием такого файла появляется возможность ввода данных с клавиатуры.

Имеются некоторые различия в использовании процедуры Reset при открытии различных типов файлов. В отношении текстовых файлов (тип Text) действие процедуры означает открытие файла только для чтения. Для нетипизированных файлов в описание процедуры добавляется еще один параметр RecSize типа word, который устанавливает длину записи для функций обмена с файлом. Процедура Reset для нетипиапрованного файла имеет вид:

Reset(tvar F: file; RecSize: word);

Процедура Rewrite создает и открывает новый файл. Использование этой процедуры требует особого внимания. При попытке создать и открыть файл с именем уже существующего на диске набора данных действие процедуры Rewrite сведется к удалению этого набора и созданию нового пустого файла с тем же именем.

При открытии новых нетипизированных файлов для задания длины записи в описании процедуры Rewrite добавляется дополнительный параметр RecSize типа word. В этом случае процедура имеет вид:

Rewrite(var F: file; RecSize: word);

Если процедура Rewrite используется для текстового файла, то к открываемому новому набору данных в дальнейшем могут быть применены только операции записи.

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

Использование процедуры Close позволяет устранить связь файловой переменной с внешним файлом, установленную с помощью процедуры Assign .

Пример: Полная цепочка команд для создания простого текстового файла с именем WORK.TXT:

К языковым средствам обслуживания файлов необходимо отнести процедуры переименования и удаления неоткрытых файлов. Использование этих процедур не зависит от типа файла.

Rename(var F; NewName : string);

Процедура переименовывает открытый файл F любого типа. Новое имя задается строкой NewName.

Процедура удаляет неоткрытый внешний файл любого типа, задаваемый переменной F.

Прежде чем приступить к выполнению индивидуальных заданий, ознакомьтесь с типами файлов, процедурами управления файловыми данными. Обратите внимание на процедуры, позволяющие оптимизировать процесс обработки файлов. Решение задач представить в следующем порядке: постановка задачи, построение математической модели, программный код, тестирование.

Задание для лабораторной работы выбрать согласно варианту по приведённой таблице. Вариант определяется порядковым номером в журнале группы.

Общие сведения.

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 сначала происходит запись буфера файла на диск, и только потом файл закрывается. Если его не закрыть вручную, то это произойдет автоматически при завершении работы программы, однако пропадет информация, хранимая в буфере файла.

Для работы с файлом после его объявления прежде всего необходимо его открыть. В языке Паскаль предусмотрены для этого две процедуры:

Reset(f : file); - открывает существующий файл;

Rewrite(f : file); - создает и открывает новый файл.

При описании обеих процедур параметр <file> означает файловую переменную любого типа. Открытие внешнего файла с помощью проце­дуры Reset в случае его отсутствия на диске может привести к ошибке при выполнении программы. Подобные ошибочные ситуации в операциях ввода-вывода позволяет отслеживать специальная функция IOresult.

Пример. Стандартное открытие файла.

Assign(f,’c:\TSS\TSS85\Vovchik.txt’);

Reset(f);

В Pascal При назначении файловой переменной пустой строки происходит автоматическая ссылка на стандартный файл ввода, что в модуле System соответствует устройству con.С открытием такого файла по­является возможность ввода данных с клавиатуры.

Операционная си­стема устанавливает каждому открываемому файлу так называ­емый обработчик файлов с определенным номером. Этот обработчик осуществляет операции обмена данными через буфер ввода-вывода. Определение таких обработчиков и их количество на сеанс работы устанавливается при загрузке операционной системы с помощью спе­циальной команды <files>, включенной в файл конфигурации 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 используется для текстового файла, то к открываемому новому набору данных в дальнейшем могут быть при­менимы только операции записи.

3. Закрытие файла - Close.

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

CloseFile(f : file); for Delphi>

Использование процедуры Close позволяет устранить связь фай­ловой переменной с внешним файлом,установленную с помощью проце­дуры Assign. Выражаясь языком операционной системы, можно ска­зать, что после обращения к процедуре Close выделенный для дан­ного файла обработчик освобождается для других работ. Этим про­диктовано требование обязательного закрытия файла после оконча­ния работы с ним.

Читайте также: