Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Динамический файл [D5, D6, Win95/98]


Valentain ©   (2002-12-05 18:26:00) 

Имеется

type
TRec = Record
Count: integer; // Количество записей в mas.
mas: array of Double;
...
end;

...
var
Fd: File of TRec;

Само-собой возникает ошибка. Как с этим бороться (или какие есть альтернативы).
С уважением...


Anatoly Podgoretsky   (2002-12-06 13:42:00) [1]

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

mas1: array of TOne;
mas2: array of TTwo;

Дальше немного лучше, но утвержение насчет FileSize(F) неверное, так как

Returns the size of a file in bytesor the number of records in a record file.

Поетому надо N := FileSize(F) div SizeOf(TRec)

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


Valentain   (2002-12-06 13:23:00) [2]

Благодарю.
> Anatoly Podgoretsky: по поводу case- я написал, наверное, несколько неполно, подразумевалось:

type
TOne = Record
a: Double;
b: Double;
c: Boolean;
end;

TRec = Record
Count: integer; // Количество записей в mas1, mas2.
mas1: array of TOne;
mas2: array of TTwo;
...
end;
...
var
Fd: File of TRec;

В первом случае fileof Double без мороки.
...
На сколько я понимаю, FileSize(F)для типизированного файла показывает количество записей, тогда необходимость в Count и array отпадает и выражение принимает вид

TRec = Record
mas1: TOne;
mas2: TTwo;
...
end;

var
F: File of TRec;
Vrec: array of TRec;
n, i: integer;
...
n:= FileSize(F);
SetLength(Vrec, N);
for i:= 0 to n-1 do Read(F, Vrec[i]);
...

Или я не прав?
С уважением...


Anatoly Podgoretsky   (2002-12-05 21:05:00) [3]

Для этого кода и запись не нужна, просто file of Double


Kotka   (2002-12-05 20:50:00) [4]

Можно использовать BlockRead и BlockWrite. Пример:
type TRec = mas:Double;
...
var f:file of TRec;
x:array [...] of TRec;
...
AssignFile("...",f);
Reset(f); или ReWrite(f);
BlockRead(f,x,n); или BlockWrite(f,x,n);//n-количество записываемых/читаемых данных
CloseFile(f);

А кол-во данных в файле будет возвращать ф-ия FileSize(f)

Код не проверялся, но должен быть правильным


Anatoly Podgoretsky   (2002-12-05 18:57:00) [5]


Type
TRec = Record
case Integer of
1: (Num: Double;);
2: (Count: integer;)
end;
var
f: File of TRec;
R: TRec;


Запись номер 0 будет счетчиком R.Сount, а записи 1..N данными


Skier   (2002-12-05 18:37:00) [6]

>Valentain
А этот mas: array of Double; можно положить к строку, используя
разделитель...
И писать всё через TStringList


MBo   (2002-12-05 18:33:00) [7]

не разрешается использовать типизированные файлы (file of) с динамическими структурами.
Используй, например, TFileStream


Наверх

Титульная страница Поиск, карта сайта Написать письмо