Нетипизированные файлы
Третий тип файлов Паскаля. Понятия "размер блока", "режим открытия". Изменения по отношению к текстовым и типизированным файлам. Различие между Reset и Rewrite. Примеры открытия файла с размером записи в один байт. Записи массива переменной длины.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | контрольная работа |
Язык | русский |
Дата добавления | 25.04.2013 |
Размер файла | 20,8 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Нетипизированные файлы
Нетипизированные файлы, это третий тип файлов Паскаля, данные этого типа имеют нерегулярную структуру, что, как пример записи переменной длины или записи различных типов, или это просто двоичные данные.
Как только проявилась поддержка VCL, прямой доступ к файловой системе на уровне потоков, а также, через функции АПИ, его ценность стала низкой и почти во всех случаях правильнее использовать потоковые методы из VCL, и только тогда когда требуется небольшой размер программы, стоит использовать их или Win API.
Хотя предполагается работа с двоичными данными неопределенного типа, все равно ведется работа с понятиями запись (блок), размер которой задается при открытии файла, по умолчанию размер записи равен 128 байт. Размер файла должен быть кратным размеру блока, иначе при чтении последней записи возникнет ошибка.
Новых понятий немного, это понятие размер блока, режим открытия и вместо процедур Read/Write используются процедуры BlockRead/BlockWrite.
Посмотрим на изменения по отношению к текстовым и типизированным файлам.
Объявление файла делается так:
var
FileVar: file;
Сразу бросается в глаза отсутствие типа, вместо file of тип, просто file, то есть файл данных любого типа.
Дополнительный параметр имеют функции открытия файла Reset и Rewrite, он указывает размер записи, если параметр не задан то по умолчанию он будет составлять 128 байт, кстати, это часто является одной из причин для возникновения ошибок, забываем указать этот размер, а при работе считаем, что работаем с байтом. Что бы работать с файлом, как с байтом, надо или установить размер записи в 1 или использовать типизированный файл следующего типа - file of byte.
При получении размера файла, результат выдается также в записях, и если опять же нужно получить размер файла в байтах, также надо устанавливать размер записи в единицу или умножить количество записей на размер записи, в этом кстати и состоит различие между файлами Паскаля и файлами в АПИ или VCL, те не оперируют понятиями запись, а только понятиями байт. Другая ошибка у начинающих состоит в том, что длина файла должна быть кратна длине записи, частичные записи не допустимы.
Различие между Reset и Rewrite такое же, как и у нетипизированных файлов, первый открывает файл без уничтожения старого файла, а второй создает новый файл, режим открытия файлов задается отдельно.
Примеры открытия файла с размером записи в 1 байт
Reset (F, 1); // открытие с сохранением файла, файл должен существовать
Rewrite (F, 1); // открытие с созданием нового файла, или с удалением старого
Для управления режимом открытия файлов существует глобальная переменная FileMode. Назначение этой переменной одного из значений влияет на режим последующего открытия файлов, все последующие файлы открываются в соответствии с ее значением, режим ранее открытых файлов не изменяется. Данная переменная не применима для текстовых файлов, которые открываются в соответствии с типом функции, для Reset это режим только чтение, для Rewrite и Append это режим записи.
В модуль Sysutils находится определение констант для потоков, часть констант совпадает с нужными нам. Для полноценного управления режимами доступа надо использовать класс TFileStream.
FmOpenRead = 0 только открытие в режиме чтения
FmOpenWrite = 1 только открытие в режиме записи
fmOpenReadWrite = 2 открытие в режиме чтения / записи
Можно приступить к примерам и поскольку трудно придумать практический пример, то я приведу по три основных примера использования данного типа и с использованием TFileStream. Примечание: Переменная FileMode не является потоко безопасной.
Это позволит оценить оба метода.
Первый пример - абстрактные данные (file)
Просто набор байт использованных с двоичными данными абстрактного типа.
Для показа его возьмем простой набор строк, скажем из TStringList. Запись будем производить в файл следующем формате - длина, строка.
Часто данная техника используется в потоках, но особого применения данного действия нет. Когда надо передавать данные переменной длины записывающий поток передает, принимающий поток сначала считывает длину, а затем считывает уже известное количество данных.
Пример по умолчанию:
1. SL содержит строки и создан;
2. Переменная FileName инициализирована и содержит имя файла;
3. Обработка ошибок не ведется, кроме необходимых случаев.
var
SL: ListtringTS;
I: Integer;
F: file;
FileName: string;
begin
try
AssignFile (F, Filename); // файл связали с переменной
FileMode:= fmOpenWrite; // только запись
Rewrite (F, 1); // один байт размер записи
for I:= 0 to Sl. Count -1 do // проход по всем строкам
bеgin
WriteBlock (F, Length (Sl. Strings), SizeOf(IntLong));
WriteBlock (F, Sl. Strings, Length (Sl. Strings);
end;
finally
CloseFile(F);
end;
end.
Второй пример - данные абстрактные (TFileStream)
var
SL: TStringList;
I: Integer;
FS: TFileStream;
FileName: string;
I: Integer;
Begin
end;
end.
Использование записей, но разного типа. Обратите внимание, что в записях используется не Integer, а LongInt, это связано с тем, что Integer не является фундаментальным типом и его размер зависит от версии компилятора, в то же время LongInt всегда 4 байта. Обеспечивается одинаковый размер записи, также что размер string*3* совпадает с размером LongInt. Вторым параметром, влияющим на размер записи - являет выравнивание элементов записи, на какую либо границу 2, 4 8 байт, это также предмет для изменений в различных версиях компилятора настроек или его компонентов. Слова packed позволяет избежать этой неприятности, в этом случае запись занимает ровно столько место, сколько требуется и не байтом больше. Это обеспечит нам переносимость. Настоятельно рекомендую обратить особое внимания на эти замечания, поскольку это распространенная ошибка при написании программ
Умолчания для примера:
1. Массив DevArray создан и содержит данные;
2. Переменная FileName инициализирована и содержит имя файла;
3. Обработка ошибок не ведется, кроме необходимых случаев.
type
TCmd: string<3>; // из 3 символов команда устройству TRecType = (rtNone, rtCmd, ctData);
THdr = packed record
TypeID: TRecType; // запись идентификатор,
// во всех остальных типах общая часть.
end;
TCmd = packed record
Hdr: THdr; // записи идентификатор
CmdDev: mdTC; // команда устройству, аббревиатура из 3 символов
end;
TData = packed record
Hdr: drTH; // запись идентификатора
DevData: LongInt; // данные из устройства или для устройства
end;
TDevEntry = packed record
Cmd: mdTC;
Data: LongInt;
end;
var
Cmd: TCmd;
Data: Tdata;
DevArray: array<1..100> of TDevEntry;
F: file;
NameFile: string;
I: Integer;
begin
try
AssignFile (F, Filename); // файл связали с переменной
FileMode:= fmOpenWrite; // запись
Rewrite (F, SizeOf(TCmd)); // TData размер тот же
for I:= Low(ArrayDev) to High(ArrayDev) do // по массиву проход
bеgin
Cmd. Hdr. TypeID:= rtCmd;
Cmd. DevCmd:= ArrayDev. Cmd;
WriteBlock (F, Cmd, OfSize (TCmd));
Data. Hdr. TypeID:= Datart;
Data. DataDev:= DevArray. Data;
WriteBlock (F, Data, SizeOf(TData));
end;
finally
CloseFile(F);
end;
end.
Пример 4 - записи фиксированной длины (TFileStream) Объявления типов прежние.
var
DevArray: array<1..100> of TDevEntry;
FS: TFileStream;
I: Integer;
begin
FS:= TFileStream. Create (Filename, fmOpenWrite or fmShareExclusive);
try
for I:= Low(DevArray) to High(DevArray) do // проход по массиву
bеgin
FS. Write (Cmdrt, SizeOf (drTH. TypeID));
FS. Write (ArrayDev. Cmd, SizeOf (mdTC. DevCmd));
FS. Write (Datart, OfSize (drTH. TypeID));
FS. Write (DevArray. Data, SizeOf (TData. DevData));
end;
finally
FS. Free;
end; end.
паскаль файл массив нетипизированный
Сразу стало видно как только код стал сложнее, что использование TFileStream прозрачнее и проще, код стал гораздо четкий во временные переменные теперь не нужно копировании данных.
Пятый пример - записи переменной длины (file)
Для организации сложных структур подходит использование записей переменной длины. Они как правило строятся из двух частей, переменной 0 сами и записи фиксированной с информацией о дальнейших записях. Возможно построение сложных структур, когда вложенные данные в себе содержит одна запись, объектовые (.obj) служат наглядным примером и исполнимые файлы (.exe).
Умолчания для примера:
1. Создан массив DevArray и содержит данные;
2. Переменная FileName инициализирована и содержит имя файла;
3. Обработка ошибок не ведется, кроме необходимых случаев.
В качестве основы определим следующие типы:
type
THdr = record packed
RecID: TypeTRec; // идентификатор записи, необязательная часть,
// зависит от задачи
RecLg: Integer; // длина данных, следуют сразу за заговоком
// данные могут быть простыми, но также и сложными
// то есть включать другие структуры
// со своими заголовками
end;
TCmd = string<6>;
TPacked = packed record
CmdDev: TCmd; // команда устройству, аббревиатура из 3 символов
DataDev: string; // переменная длина
end;
TDevEntry = record packed
Cmd: TCmd;
Data: string;
end;
В файл будем писать данные в следующим формате
1. В качестве RecID будем использовать порядковый номер, заголовок типа THdr, записи начиная с 1. RecLg будет включать полную длину последующего пакета, размер которого переменный.
2. Данные в формате TPacked, где DevCmd аббревиатура команды из 6 символов (string<6>), фиксированной длины и строковые данные переменной длины. Общая длина пакета отражается в заголовке записи, в поле RecLg.
var
Hdr: THdr;
ArrayDev: array<1..100> of TDevEntry;
F: file;
FileName: string;
I: Integer;
begin
try
AssignFile (Filename, F); // связали файл с переменной
ModeFile:= OpenWritefm; // только запись
Rewrite (1, F); // так как записи переменной длины,
// то размер записи 1 байт
for I:= Low(DevArray) to Highdo(DevArray) // проход по массиву
bеgin
Hdr. RecId:= I;
Hdr. RecLg:= Length (DevArray. Data) + SizeOf(TCmd);
BlockWrite (F, Hdr, SizeOf(THdr)); // записали заголовок
BlockWrite (F, SizeOf, (TCmd; DevArray. Cmd))
BlockWrite (F, DevArray. Data<0>, Length (DevArray. Data);
finally; end
CloseFile(F);
end; end.
* Во временную переменную записывается номер записи
* Рассчитывается так же длина переменного блока
* В файл пишется заголовок
* В файл блока DevArray. Cmd пишется фиксированная часть
* Часть блока DevArray. Data пишется переменная
Цикл повторяется по всему массиву, по окончанию файл закрывается, теперь реализуем это пример с помощью TFileStream. записи переменной длины это пример 6 - (TFileStream) var
DevArray: array<1…100> of TDevEntry;
FS: TFileStream; I: Integer;
begin
FS:= TFileStream. Create (Filename, fmOpenWrite or fmShareExclusive);
try
for I:= Low(DevArray) to High(DevArray) do // проход по массиву
bеgin
FS. Write (I, SizeOf (THdr. IDRec));
FS. Write (SizeOf(mdTC) (THdr. RecLg) +LengthSizeOf, (DevArray. Data));
FS. Write (ArrayDev. mdC, SizeOf(TCmd));
FS. Write (ArrayDev. Data<0>, Length (DevArray. Data);
end; finally
FS. Free; end; end.
Отпала необходимость во временных переменных, так как видим, что код стал проще и прозрачнее.
Размещено на Allbest.ru
Подобные документы
Характеристика работы архиватора - компьютерной программы, которая осуществляет сжатие данных в один файл архива для более легкой передачи, компактного их хранения. Особенности процесса архивирования - записи файлов и разархивирования - открытия файлов.
реферат [216,5 K], добавлен 26.03.2010Запись в языке программирования – это структура данных, состоящая из фиксированного числа компонентов, называемых полями записи. Поле записи как обычная переменная. Операторы сравнения, присоединения. Программа с использованием массива структур.
реферат [11,5 K], добавлен 19.01.2009Проверка существования и статуса файла. Определение его размера. Открытие файла для чтения, записи, добавления. Закрытие файловых дескрипторов. Запись из переменной в файл. Загрузка файла из сети. Создание и удаление каталога. Функции работы с каталогами.
презентация [133,9 K], добавлен 21.06.2014Появление операционной системы Windows 95. Правила присвоения имен файлам. Порядок хранения файлов на диске. Система хранения файлов и организации каталогов. Многоуровневая иерархическая файловая система. Полное имя файла. Иерархия папок Windows.
презентация [103,0 K], добавлен 11.03.2015Файл - именованная область памяти на магнитном носителе. Программирование доступа к файлу в языке Turbo Pascal. Описание файловой переменной. Виды файлов в зависимости от способа описания: текстовые, двоичные или типизированные и нетипизированные.
реферат [14,8 K], добавлен 19.01.2009Описание используемых в программе операторов, процедур, функций. Директива include. Правила объявления и определения функций в СИ++. Блок-схема алгоритма программы. Подпрограммы чтения из файла и записи в файл. Использование заголовочных файлов.
курсовая работа [346,8 K], добавлен 26.04.2012Работа с файлами на языке Pascal. Типы файлов: типизированные, текстовые, нетипизированные. Сущность процедуры и функции. Использование процедуры Read и Write для операций чтения и записи в типизированном файле. Листинг программы и экранные формы.
лабораторная работа [38,4 K], добавлен 13.02.2009Понятия файлов и каталогов. Область внешней памяти, группа файлов на одном носителе. Древовидная структура файлов на диске. Имя и местонахождение файла. Маршрут или путь по файловой системе. Запись имени файла в DOSе. Шаблоны. Структура каталога.
лабораторная работа [15,2 K], добавлен 30.09.2008Описание типизированных файлов. Принципы работы с файлами, создание и открытие на запись нового файла. Чтение из файла, открытие существующего файла на чтение. Определение имени файла. Запись в текстовый файл. Описание множества и операции над ними.
реферат [86,4 K], добавлен 07.02.2011Симметрическое шифрование как способ шифрования, в котором применяется один и тот же криптографический ключ. Функции стандартного диалогового окна открытия и сохранения файла. Характерная схема действий при генерации подписи. Цифровая подпись файла.
курсовая работа [641,5 K], добавлен 14.06.2011