This repository has been archived on 2024-12-25. You can view files and clone it, but cannot push or open issues or pull requests.
OldPascalProjects/BlockFileOfT/Основы.pas
2024-03-10 20:32:51 +03:00

67 lines
3.5 KiB
ObjectPascal
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

uses BlockFileOfT;
type
r1=record
i:integer;
r:real;
constructor(i:integer; r:real);
begin
self.i := i;
self.r := r;
end;
///Переопределение того - как объекты типа r1 будет выписывать writeln
function ToString:string; override :=
$'r1({i}, {r})';
end;
begin
// var f: BlockFileOf<r1>;
// f := new BlockFileOf<r1>; // В отличии от file of T - BlockFileOf<T> всегда надо инициализировать перед тем как использовать
// f.Assign('temp.bin');
var f := new BlockFileOf<r1>('temp.bin'); // эта строчка работает как предыдущие 3
f.Rewrite; // Если навести мышку на метод (в данном случае .Rewrite) - показывает описание
f.Write(new r1(123,123.456));
f.Write(new r1(456,456.789));
// f.Flush; // не обязательно - .Close вызывает .Flush перед тем как закрыть файл
// После работы с файлом - надо его закрыть. Иначе:
// 1. Часть данных может не сохраниться
// 2. Изменять файл вне переменной f будет нельзя, пока f держит его открытым
f.Close;
// f.Assign('temp.bin'); // Не обязательно, файл остаётся привязан после закрытия
f.Reset;
writeln($'Read#1: {f.Read}'); // r1(123,123.456)
writeln($'Pos#1: {f.Pos}'); // 1, потому что мы открыли файл через ".Reset" (курсор в начале файла) и затем прочитали 1 элемент
// В отличии от file of T, у BlockFileOf<T> нету режима чтения и режима записи
// Они объеденены, поэтому не надо закрывать файл чтобы записать что-то после чтения
f.Write(new r1(0,0));
writeln($'Size#1: {f.Size}'); // 2, потому что r1(0,0) НЕ втиснуло между первыми 2 элементами, а записало поверх второго
writeln($'EOF: {f.EOF}'); // True, потому что у нас всего было 2 элемента и курсор сейчас стоит на позиции 2 (1 чтение + 1 запись)
// f.Seek(1);
f.Pos := 1; // То же самое, что и .Seek(1), но лучше
writeln($'Read#2: {f.Read}'); // r1(0,0), то, что мы только что записали
f.Pos := 5; // Можно ставить за границей файла
// f.Read; // Ошибка: Нельзя читать за пределами файла. Можно только записывать
f.Write(new r1);
writeln($'Size#2: {f.Size}'); // 6, потому что мы записали +1 элемент после позиции 5
// Но вообще, размер правильно менять так:
f.Size := 10;
writeln($'Size#3: {f.Size}'); // 10
writeln($'Pos#2: {f.Pos}'); // 6, как и была после того, как мы последний раз вызвали .Write
// Программа сейчас завершится, поэтому файл закроется сам
// Но если не вызвать хотя бы Flush, то изменения могут не сохранится
f.Flush;
end.