![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Определение количества записей в файле
XfroSt © (2005-02-19 04:48:00)Суть такова я использу файл собственного типа :
type
TMember = record
Name : string[50];
eMail : string[30];
Posts : LongInt;
end;
Пишу в него так :
a.Name := name.Text;
a.eMail := mail.Text;
AssignFile(F, 'Members.dat');
if not(FileExists('Members.dat')) then ReWrite(F)
else
Reset(F);
Seek(F,FileSize(F));
a.Posts := FilePos(F)+1;
try
Write(F, a);
finally
CloseFile(F);
end;
Читаю так :
AssignFile(F,'members.dat');
memo.Clear;
Reset(F);
try
while not Eof(F) do begin
Read (F, a);
memo.Lines.Add('Имя : '+a.name);
memo.Lines.Add('Мыло : '+a.eMail);
memo.Lines.Add('---------------');
end;
finally
CloseFile(F);
end;
Вопрос как мне узнать количество записей в файле ? Я делаю это так :
i := 0;
AssignFile(F,'members.dat');
Reset(F);
try
while not Eof(F) do begin
Read(F, a);
inc(i);
end;
finally
CloseFile(F);
end;
Но мне кажется это долгий способ можно как нибуть сразу почить количество записей в файле?
XfroSt (2005-02-20 13:33:00) [1]Спасибо.
Теперь поняно...
begin...end (2005-02-20 13:27:00) [2]> XfroSt (20.02.05 12:42) [15]
>>Только не вздумайте потом записывать это в файл.
> А что будет?
Ничего очень страшного не будет. Но это бессмысленно, т.к. при последующем запуске программы и чтении из файла этих указателей они будут недействительными.
XfroSt (2005-02-20 12:42:00) [3]F : file of TMember
файл моего типа.
>Только не вздумайте потом записывать это в файл.
А что будет?
begin...end (2005-02-19 17:20:00) [4]> XfroSt (19.02.05 16:40) [9]
> а если я делаю вот такой тип?
> im : array[0..50] of TImage;
Только не вздумайте потом записывать это в файл.
Anatoly Podgoretsky (2005-02-19 17:17:00) [5]Я просил тебя указать, что такое F, по ряду признаков выходит что типизированный (хотя может и нет), если это типизированый файл то FileSize возвращает количество записей, если не типизированый, то количество блоков.
XfroSt (2005-02-19 16:48:00) [6]Я работаю с типизарованными файлами поэтому тут надо указывать жестка скока чего иначе тип не определиться и компилятор начнет ругаться.
ЦУКОР5 (2005-02-19 16:47:00) [7]а что мешает сделать дин.масив?
im : array of чего-то там;
...
setlength(im,размер);
Юрий Зотов (2005-02-19 16:46:00) [8]> XfroSt (19.02.05 16:40) [9]
Это массив указателей. Указатель имеет размер 4 байта. Значит, размер массива будет 51*4=204 байта.
XfroSt (2005-02-19 16:40:00) [9]а если я делаю вот такой тип?
im : array[0..50] of TImage;
имейдж я не определяю т.к. не знаю скока он будет, то все равно выделиться фиксированное количество памяти?
Юрий Зотов (2005-02-19 16:36:00) [10]> XfroSt (19.02.05 16:34) [7]
Под статические массивы и короткие строки память выделяется сразу. Значит, размер записи не будет зависеть от того, как она заполнена.
XfroSt (2005-02-19 16:34:00) [11]правельно будет так
Name : array[0..100] of string[50];
eMail : string[0..100] of string[30];
Если я использую такую структуру и заполняю тока некотороые элементы массива то размер записи все равно будет одинаковый?
Или он меняется от количество заполненных элементов в массиве?
Юрий Зотов (2005-02-19 13:16:00) [12]Как узнать количество записей в типизированном файле?
Очень просто - поделить размер файла на размер его элемента:
FileSize(F) div SizeOf(TMember)
Anatoly Podgoretsky (2005-02-19 09:51:00) [13]Что такое F?
begin...end (2005-02-19 08:15:00) [14]> XfroSt (19.02.05 5:37) [3]
> хм нет размер записи всегда варьируется т.к. я
> использую масствы и не все элемменты заполняю тока
> каикие надо
Что-то я уже не понял. В своём первом посте Вы показываете работу с типизированным файлом. Все элементы такого файла могут быть только однотипными. И никаких массивов в Вашем первом посте нет.
XfroSt (2005-02-19 05:37:00) [15]хм нет размер записи всегда варьируется т.к. я использую масствы и не все элемменты заполняю тока каикие надо.
А сама CountOfRecord тогда какого типа должна быть?
novice__man (2005-02-19 05:15:00) [16]А если размер записи постоянный то можно так: (размер файла) div (размер записи)
novice__man (2005-02-19 05:10:00) [17]Сохрани в начале файла количество записей, например так:
Write(f, CountOfRecord); {CountOfRecord: integer}
(я обычно использую BlockRead/BlockWrite), а потом считывай при открытии.