Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.06;
Скачать: CL | DM;

Вниз

Определение количества записей в файле   Найти похожие ветки 

 
XfroSt   (2005-02-19 04:48) [0]

Суть такова я использу файл собственного типа :

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;

Но мне кажется это долгий способ можно как нибуть сразу почить количество записей в файле?


 
novice__man   (2005-02-19 05:10) [1]

Сохрани в начале файла количество записей, например так:
Write(f, CountOfRecord); {CountOfRecord: integer}
(я обычно использую BlockRead/BlockWrite), а потом считывай при открытии.


 
novice__man   (2005-02-19 05:15) [2]

А если размер записи постоянный то можно так: (размер файла) div (размер записи)


 
XfroSt   (2005-02-19 05:37) [3]

хм нет размер записи всегда варьируется т.к. я использую масствы и не все элемменты заполняю тока каикие надо.

А сама CountOfRecord тогда какого типа должна быть?


 
begin...end ©   (2005-02-19 08:15) [4]

> XfroSt   (19.02.05 5:37) [3]

> хм нет размер записи всегда варьируется т.к. я
> использую масствы и не все элемменты заполняю тока
> каикие надо

Что-то я уже не понял. В своём первом посте Вы показываете работу с типизированным файлом. Все элементы такого файла могут быть только однотипными. И никаких массивов в Вашем первом посте нет.


 
Anatoly Podgoretsky ©   (2005-02-19 09:51) [5]

Что такое F?


 
Юрий Зотов ©   (2005-02-19 13:16) [6]

Как узнать количество записей в типизированном файле?

Очень просто - поделить размер файла на размер его элемента:
FileSize(F) div SizeOf(TMember)


 
XfroSt   (2005-02-19 16:34) [7]

правельно будет так

Name  : array[0..100] of string[50];
eMail : string[0..100] of string[30];


Если я использую такую структуру и заполняю тока некотороые элементы массива то размер записи все равно будет одинаковый?
Или он меняется от количество заполненных элементов в массиве?


 
Юрий Зотов ©   (2005-02-19 16:36) [8]

> XfroSt   (19.02.05 16:34) [7]

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


 
XfroSt   (2005-02-19 16:40) [9]

а если я делаю вот такой тип?

im : array[0..50] of TImage;

имейдж я не определяю т.к. не знаю скока он будет, то все равно выделиться фиксированное количество памяти?


 
Юрий Зотов ©   (2005-02-19 16:46) [10]

> XfroSt   (19.02.05 16:40) [9]

Это массив указателей. Указатель имеет размер 4 байта. Значит, размер массива будет 51*4=204 байта.


 
ЦУКОР5   (2005-02-19 16:47) [11]

а что мешает сделать дин.масив?

im : array of чего-то там;
...
setlength(im,размер);


 
XfroSt   (2005-02-19 16:48) [12]

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


 
Anatoly Podgoretsky ©   (2005-02-19 17:17) [13]

Я просил тебя указать, что такое F, по ряду признаков выходит что типизированный (хотя может и нет), если это типизированый файл то FileSize возвращает количество записей, если не типизированый, то количество блоков.


 
begin...end ©   (2005-02-19 17:20) [14]

> XfroSt   (19.02.05 16:40) [9]

> а если я делаю вот такой тип?
> im : array[0..50] of TImage;

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


 
XfroSt   (2005-02-20 12:42) [15]

F : file of TMember
файл моего типа.

>Только не вздумайте потом записывать это в файл.
А что будет?


 
begin...end ©   (2005-02-20 13:27) [16]

> XfroSt   (20.02.05 12:42) [15]
>>Только не вздумайте потом записывать это в файл.
> А что будет?

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


 
XfroSt   (2005-02-20 13:33) [17]

Спасибо.
Теперь поняно...



Страницы: 1 вся ветка

Текущий архив: 2005.03.06;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.05 c
14-1108299529
dmk
2005-02-13 15:58
2005.03.06
Присяжный заседатель


14-1108102830
Soft
2005-02-11 09:20
2005.03.06
Умные люди глупеют под давлением.


1-1108523985
Wowa-K
2005-02-16 06:19
2005.03.06
Быстрая вставка данных в Word


10-1084796970
VK220
2004-05-17 16:29
2005.03.06
Здравствуйте! Если функция _AddRef вызывается при любом обращении


3-1107795797
Vantage-10
2005-02-07 20:03
2005.03.06
Врменная таблийа в Access