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

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

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


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), а потом считывай при открытии.


Наверх

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