Типизированные файлы в delphi - IT Справочник
Llscompany.ru

IT Справочник
6 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Типизированные файлы в delphi

Delphi-Help

Типизированные файлы

  • размер шрифта уменьшить размер шрифта увеличить размер шрифта
  • Печать

Типизированные файлы

Тип файлов, для которого нет поддержки в OS и VCL – это типизированные файлы. Это такой вид файлов, в котором содержатся записи одного типа и фиксированной длины. Часто используется или для организации мини баз, конфигураций, иногда для импорта/экспорта в специальных форматах. Работа с такими файлами не сложнее, чем работа с текстовыми файлами, наряду с освоенными методами добавляется только одно новое свойство. Если текстовые файлы чисто последовательные, то в типизированных файлах можно перемещаться на любую запись и затем производить последовательное чтение или запись. Это очень похоже на работу с TFileStream за одним исключением, единицей информации является не байт, а тип.

В тему предлагаю ресурс — File Crack — Кряки / Патчи. Только проверенные «лекарства» для программ и игр Windows. Подробнее: https://filecrack.ru

Типизированный файл определяется следующим образом

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

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

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

Для определения текущей позиции в файле можно использовать функцию FilePos.

Для уменьшения длины файла можно использовать процедуру Truncate, которая обрезает файл по текущей позиции

Замечания по поводу открытия файлов, для этого используются две ранее описанные процедуры: ReWrite — создает новый файл для чтения/записи, если такой файл существует, то его длина устанавливается в ноль и Reset — открывает файл для чтения/записи и не изменяет его длины. Сразу видно различие в этих процедурах по отношению к текстовым файлам.

Примечание: записи считаются с нуля

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

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

Примеры работы с типизированными файлами: определение глобальных для модуля или программы переменных

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

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

Типизированный файл

Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.

Итак, типизированный файл содержит совокупность элементов, принадлежащих типу, который определен в объявлении файловой переменной. Доступ к элементам файла, как правило, происходит последовательно. Можно также переместить указатель текущей позиции (с помощью процедуры seek) к любому элементу файла.

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

Для управления типизированными файлами подходят все процедуры, которые приведены в табл. 3.14.

Таблица 3.14. Процедуры и функции для работы с файлами

Процедура или функция

Открывает существующий файл для добавления

Присваивает имя внешнего файла файловой переменкой

Считывает один или несколько блоков из нетипиэированного файла

Записывает один или несколько блоков в нетипизированный файл

Окончание табл. 3.J4.

Процедура или функция

Изменяет текущий каталог

Возвращает статус конца файла

Возвращает статус строки текстового файла

Стирает внешний файл

Возвращает текущую позицию типизированного или нетипизировэнного

Возвращает текущий размер файла. Неприменима для текстовых файлов

Перезаписывает буфер в выходной файл

Возвращает текущий каталог определенного тома

Возвращает целочисленное значение, определяющее статус

выполнения последней функции ввода-вывода

Считывает одно или несколько значений из файла в одну или

То же, что и Read, но дополнительно производит переход на следующую

строку в текстовых файлах

Переименовывает внешний файл

Открывает существующий файл

Создает и открывает новый файл

Удаляет пустой подкатапог

Перемещает указатепь в типизированных или нетипиэированных файлах

на заданный компонент. Не используется с текстовыми файлами

Возвращает статус конца текстового файла

Возвращает статус конца строки текстового файпа

Присваивает буфер ввода-вывода текстовому файлу

Обрезает типизированные или нетипизированные файлы после

текущего положения указателя

Читать еще:  Matlab задание массива

Записывает одно или несколько значений в файл

То же, что и write, но затем записывает маркер конца строки

в текстовые файлы

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

Вот как выглядит сигнатура процедуры Read для типизированных файлов.

Здесь F — файловая переменная, созданная с помощью конструкции file of. VI — Vn — одна или несколько переменных, принадлежащих любому типу, за исключением файлового.

Запись в файл осуществляет процедура Write. Использование данной процедуры для типизированных файлов заключается в присвоении значений некоторых переменных компонентам файла.

Сигнатура процедуры Write для типизированного файла выглядит так.

Здесь F — файловая переменная, созданная с помощью конструкции file of.

VI — Vn — одна или несколько переменных, принадлежащих любому типу, за исключением фзйлового (эти переменные должны быть того же типа, что и компоненты файла).

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

Вот как можно скопировать файлы с помощью типизированных файловых переменных, var

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

В той версии Delphi, с которой я работаю, ключевое слово file не распознается компилятором, хотя в справочной системе приведено полное описание файлов наравне с другими конструкциями. В данной ситуации необходимо использовать потоки, в частности тип TFileStream, тем более что разработчики Delphi рекомендуют использовать этот тип как наиболее полно отвечающий всем потребностям.

Работа с файлами в Delphi: классика Pascal. Работа с типизированными файлами в Delphi

Удивительно, но факт — запрос «delphi файлы» в Яндексе — это один из самых популярных запросов, касающихся Delphi. Популярнее только «delphi скачать» — видимо ещё не все слышали про такую штуку как Delphi Community Edition. Раз есть в Сети запрос — должен быть и ответ. Посмотрим, что получится в итоге.

Содержание статьи

Классика работы с файлами в Delphi — ключевое слово File

Этот способ, без преувеличения, можно назвать древнейшим способом работы с файлами в Pascal/Delphi. Однако и он до сих пор используется в работе, особенно, если это, например, лабораторная работа по информатике в школе или ВУЗе.

Для определения файловой переменной в Delphi/Pascal используется ключевое слово File. При этом, мы можем определить как типизированный файл, так и не типизированный, например:

Для типизированного фала мы можем задать тип данных фиксированного размера (ShortString, String[20], Integer, Single и так далее), например, мы можем определить такие типизированные файлы:

Или, как в примере выше использовать для указания типа запись (record), в которой все поля имеют фиксированный размер. Для типизированного файла нельзя указывать типы данных, размер которых не фиксирован, например, вот такие определения файловых переменных недопустимы:

Более того, даже компилятор Delphi укажет вам на ошибку, сообщив следующее:

Определив файловую переменную можно приступать к работе с файлом. Алгоритм работы при этом будет следующим:

  1. Ассоциировать файловую переменную с файлом на диске
  2. Открыть файл
  3. Записать/Прочитать файл
  4. Закрыть файл

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

Работа с типизированными файлами в Delphi

Рассмотрим несколько примеров работы с типизированными файлами в Delphi.
Для начала, рассмотрим вариант работы с типизированным файлом, например, представленном выше:

Пример №1. Запись данных в типизированный файл Delphi

Запишем в наш файл две записи:

Рассмотрим методы, используемые в этом примере:

Связывает файловую переменную F с внешним файлом FileName. В качестве второго параметра может задаваться как абсолютный путь к файлу, например, ‘C:/MyFile.txt‘, так и относительный, например, в коде выше файл будет создан рядом с exe-файлом.

Создает новый файл и открывает его. Если внешний файл с таким именем уже существует, он удаляется и на его месте создается новый пустой файл. Если F уже открыт, он сначала закрывается, а затем воссоздается. Текущая позиция файла устанавливается в начале пустого файла.
F — это переменная, связанная с внешним файлом с использованием AssignFile. RecSize — это необязательное выражение, которое можно указывать, только если F является нетипизированным файлом (об этом ниже).

Используется для записи в типизированный файл. F — файловая переменная, P1..PN — это переменная того же типа, что и тип файла F.

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

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

Читать еще:  Matlab с нуля

Для того, чтобы в delphi не перезаписывать каждый раз файл, а добавлять в конец файла новые записи необходимо открывать типизированные файлы методом Reset. Рассмотрим пример добавления новых записей в типизированные файлы Delphi.

Пример №2. Добавление записей в типизированный файл Delphi

Рассмотрим такой пример Delphi:

Разберемся с тем, что здесь делается. Во-первых, условие:

проверяет, существует ли файл на диске. Метод FileExist имеет следующее описание:

FileName — имя файла, существование которого необходимо проверить. Второй параметр — FollowLink учитывается только при использовании символической ссылки. То есть, если нужно проверить только наличие символической ссылки на файл, то параметр FollowLink устанавливается в False, а если нужно проверить наличие и символической ссылки на файл и самого файла, то FollowLink устанавливается в True (значение по умолчанию).

Таким образом, в нашем примере, если файла нет на диске то он создается пустым. Далее выполняется цикл:

В этом цикле, если пользователь вводит 1, выполняется процедура AppendTypedFile, которая добавляет в файл очередную запись:

Здесь, в принципе, весь алгоритм расписан в комментариях к процедуре.
Метод Reset не воссоздает файл снова, как Rewrite, а открывает его для чтения/записи (в случае двоичных файлов). Что касается метода Seek, то он имеет следующее описание:

F — файловая переменная, ассоциированная с файлом на диске, N — номер записи в файле (первый номер — 0). Чтобы переместиться сразу в конец файла, мы сделали такой вызов:

где FileSize — это метод Delphi имеющий следующее описание:

В случае использования типизированных файлов эта функция возвращает количество записей в файле.

После того, как пользователь вводит что-то кроме 1 срабатывает метод ReadTypedFile — чтение всех записей из файла:

Здесь мы, опять же, открываем файл методом Reset и в цикле while..do проходим по всем записям файла, пока не дойдем до конца. Здесь мы использовали два новых метода Delphi:

Eof возвращает True, если текущая позиция файла находится за последним символом файла или файл пуст. В противном случае Eof возвращает False.
По аналогии с методом Write, метод Read производит чтение очередной записи из файла и имеет следующее описание:

Результат работы нашего примера может быть следующим:

Ещё одним полезным методом для работы с типизированными файлами может быть процедура Truncate:

Удаляет все записи после текущей позиции файла. Вызовите Truncate в коде Delphi, чтобы текущая позиция файла стала концом файла (Eof (F) вернет true).
Рассмотрим пример использования этой процедуры.

Пример №3. Удаление последних записей типизированного файла в Delphi

Воспользуемся файлом, созданным в предыдущем примере и удалим из него две последние записи:

В этом примере мы делаем следующее:

  1. Открываем файл существующий AssignFile/Reset
  2. Определяем количество записей в файле (Count:=FileSize(TypedFile))
  3. Если количество записей меньше двух, то спрашиваем у пользователя стереть ли все записи и, в случае положительного ответа, вызываем метод Tuncate
  4. Если количество записей в файле больше двух, то смещаемся на нужную нам позицию в файле (Seek(TypedFile, Count-2)) и затираем две последние записи методом Truncate.

Подведем итог

Для работы с типизированными файлами в Delphi в самом общем случае нам необходимо выполнить следующую последовательность операций:

  1. Определить тип записей в файле — это могут быть стандартные типы данных Delphi с фиксированным размером: ShortString, integer, single и так далее или собственные типы данных, например, записи (record), но, в этом случае, главное условие — размер записи должен быть фиксированным.
  2. В коде Delphi/Pascal определить файловую переменную, используя ключевое слово fileи, указав тип записей файла, определенный в пункте 1.
  3. Ассоциировать файловую переменную с внешним файлом на диске, используя метод AssignFile.
  4. Открыть файл для чтения/записи, используя методы Rewrite/Reset.
  5. Чтобы сделать в файл очередную запись используем метод Write, для чтения очередной записи из файла — используем метод Read.
  6. Закрыть файл методом CloseFile.

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

Функции и процедуры для работы с типизированными файлами в Delphi/Pascal

DelphiSite

Наиболее читаемое

Типизированные файлы

Теперь разберем типизированные файлы. Типизированный файл — это файл в котором записанны идентичные структуры. Например любой файл можно считать файлом байтов — т.е. можно его читать байт за байтом, можно перейти сразу к любому байту по его номеру, можно сразу узнать сколько байт в файле, можно заменить любой байт на другой не перезаписывая файл. Теперь все это в примерах:
Объявляем файл байтов:
var f:file of byte;
b:Byte;
Ассоциируем файловую переменную с физическим файлом:
AssignFile(f,’c:myfile.bin’);
Теперь мы можем либо перезаписать/создать файл:
Rewrite(f);
Либо открыть существующий для чтения и записи:
Reset(f);
Обратите внимание, что функция Reset хотя и имеет такой же формат как и для текстовых файлов, но открытый ей файл можно и читать и писать, в отличие от текстовых.
Теперь функции работы с файлом:
read(f,b); — прочитать 1 байт
write(f,b); — записать 1 байт
seek(f,100); — поставить текущее положение считывания/записи на сотый байт
Size(f); — прочитать количество байт в файле.
Eof(f); — узнать не являетсмя ли байт последним
Все эти функции не работают с файлами большими 2 Gb.
После работы файл надо закрыть:
CloseFile(f);
Приведенные выше механизмы будут работать с любым файлом, так как любой файл можно считать файлом байтов. Теперь где это можно использовать? В принципе везде, но в подавляющем большинстве случаев это будет очень неудобно, ведь скорость считывания при чтении по байтам будет на порядки более низкой чем другими способами. Однако в некоторых случаях этот способ может быть очень полезен. Например в программе вам надо заменить 100й байт файла на другой, или прочитать 100й байт файла, например во всяких читерских программах, при взломе и т.п. Здесь такой доступ будет весьма удобен. Гораздо более интересным представляется дальнейшее развитие технологии типизированных файлов (их еще лет 15 назад называли «Файлы прямого доступа»). Представим себе, что файл состоит не из байт а из более сложных структур. Например мы имеем некоторую информацию в виде:

Читать еще:  Int 10h ассемблер

Type MyRec= Record

Name: string [ 100 ] ;

Accounts: array [ 1 .. 10 ] of integer ;

Обратите внимание, что все элементы записи точно типизированны, нет ни длинных строк, ни открытых массивов, ни объектов, другими словами, заранее точно известно сколько именно байт будет занимать переменная этого типа. Объявим переменную этого типа:
Var MyVar:MyRec;
и файл этого типа:
Var f:File of MyRec;
Теперь мы можем читать и писать сразу целую структуру, абсолютно так же как и если бы это был один байт:

AssignFile ( f, ‘c:MyFile.rec’ ) ;

MyVar. Name := ‘Vitaly’ ;

MyVar. Membership := True ;

MyVar. Accounts [ 1 ] := 12345 ;

MyVar. Accounts [ 2 ] := 34985 ;

Все остальные функции приведенные в предыдущей статье будут работать так же, только одно отличие — Seek и Size оперируют не с количеством байт, а с количеством записей.

NMDSOFT

Программирование в среде Delphi. Не ошибается тот, кто ничего не делает.

Блог по программированию в среде Delphi

Поиск по блогу

Есть идея по созданию интересной программы?

понедельник, 17 мая 2010 г.

Нетипизированные файлы в Delphi

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

AssignFile(f, ‘c:1111.txt’);//открытие файла

Reset(f);//как это ни странно это открытие файла так же можно употреблять для добавления
записей (Append(f))

Rewrite(f);//Создает новый файл и открывает его.

Seek(f, Filesize(f)); // перемещаемся в конец файла

Write(f,ppp);//записать содержимое в файл

нашел в учебнике по Delphi 7 для начинающих пример программки немного пришло поправить, а то просто не хотел компилиться проект

для работы программы необходимы
2 ComboBox
3 Label
1 RadioGroup
1 TEdit
1 Button

листинг программки для записи структуры в файл

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
// тип медали
TKind = (GOLD, SILVER, BRONZE);
// запись файла
TMedal=record
country: string[20]; // страна
sport: string[20]; // вид спорта
person: string[40]; // спортсмен
kind: TKind; // медаль
end;

type
TForm1 = class(TForm)
Button1: TButton;
ComboBox1: TComboBox;
ComboBox2: TComboBox;
Edit1: TEdit;
RadioGroup1: TRadioGroup;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
procedure FormActivate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
private
< Private declarations >
public
< Public declarations >
end;

var
Form1: TForm1;
f: file of TMedal; // файл записей — база данных

procedure TForm1.FormActivate(Sender: TObject);
var
resp : word; // ответ пользователя
begin
AssignFile(f, ‘c:1111.txt’);
Reset(f); // открыть файл
Seek(f, Filesize(f)); // указатель записи в конец файла
if IOResult = 0 then
Button1.enabled:=TRUE // теперь кнопка Добавить доступна
else
begin
resp:=MessageDlg(‘Файл базы данных не найден. Создать новую БД?’, mtInformation,[mbYes,mbNo],0);
if resp = mrYes then
begin
<$I->
Rewrite(f);
<$i+>
if IOResult = 0 then
Button1.enabled:=TRUE
else
ShowMessage(‘Ошибка создания файла БД.’);
end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
medal: TMedal;
begin
with medal do
begin
country := ComboBox1.Text;
sport := ComboBox2.Text;
person := Edit1.Text;
case RadioGroup1.ItemIndex of
0: kind := GOLD;
1: kind := SILVER;
2: kind := BRONZE;
end;
end;
Write(f,medal); // записать содержимое полей записи в файл
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
CloseFile(f); // закрыть файл
end;

Ссылка на основную публикацию
ВсеИнструменты 220 Вольт
Adblock
detector