Авторизация

Логин: Пароль:
Регистрация Забыли свой пароль?

FileSize для типизированных файлов

Страницы: 1
FileSize для типизированных файлов
Везде написано, что функция filesize возвращает для типизированных файлов количество записей, но у меня она возвращает только количество байт. Вот мой код
Код
 
program create_files;
{$mode objfpc}{$H+} {$APPTYPE CONSOLE}
uses CRT, FileUtil, SysUtils;
type
    manager=record
    name:string[18];
    comp: integer;
end;
var
  company:manager;
  fmanager: File of manager; // Файловая переменная
  k, n:integer;
begin
  AssignFile(fmanager,'File_manager.dat');
  if not FileExists('File_manager.dat') then
    Rewrite(fmanager)
  else
    Reset(fmanager);
  Seek(fmanager, FileSize('File_manager.dat'));
  writeln(UTF8ToConsole('Введите количество менеджеров компании'));
  readln(n);
  with company do
  begin
    for k:=1 to n do
    begin
      writeln(UTF8ToConsole('Введите фамилию'));
      readln(name);
      writeln(UTF8ToConsole('Введите количество реализованных им компьютеров'));
      readln(comp);
      Write(fmanager, company); // запись в файл
    end;
  end;
  writeln(UTF8ToConsole('Информация на диск записана'));
  CloseFile(fmanager);
  writeln(UTF8ToConsole('Нажмите любую клавишу'));
  readkey;
end. 

Так я создаю файл. Для примера записал в него 2 записи. Теперь использую filesize и она возвращает 48. Вот код
Код
program manager_computer;
{$mode objfpc}{$H+} {$APPTYPE CONSOLE}
uses crt, FileUtil, SysUtils;
type
    manager=record
    name:string[18];
    comp: integer;
end;
var
  company:manager;
  fmanager: File of manager; // Файловая переменная
  sum, cost, prem, k, n: integer;
  sumc, sumv, sump, sum1: integer;
begin
  if not FileExists('File_manager.dat') then
  begin
    writeln(UTF8ToConsole('Файлы не существуют'));
    writeln(UTF8ToConsole('Сначала создайте их'));
    writeln(UTF8ToConsole('Нажмите любую клавишу'));
    readkey;
    exit;
  end;
  AssignFile(fmanager,'File_manager.dat');
  Reset(fmanager);
  n:= FileSize('File_manager.dat');
  writeln('FileSize= ', n);
  readkey;  

Подскажите, в чем может быть проблема?
Насколько я знаю, есть две функции filesize. Одна возвращает количество байт, а вторая количество записей. Вам нужно использовать вторую.
Все верно. Используйте функцию filesize, передав ей параметр соответствующего типа. Делайте так
Код
  AssignFile(fmanager,'File_manager.dat');
  Reset(fmanager);
  n:= FileSize(fmanager);
Сначала я так и делал, но в результате у меня появлялась ошибка
Код
manager.lpr(29,24) Error: Incompatible type for arg no. 1: Got "File Of manager", expected "AnsiString"
Тогда попробуйте так
Код
System.FileSize()
Спасибо получилось. А нет каких-нибудь настроек по умолчанию, чтобы не писать
Код
System.
Изменено: Николай Евсеев - 29.12.2009 21:45:15
Тут дело в том, что одна функция располагается в модуле System, а вторая в FileUtil. Если Вам не нужен второй модуль, то просто удалите его из секции uses
Спасибо, понял. А из fileutil я использую функцию UTF8ToConsole, поэтому придется писать через точку.
Вы можете создать в новом модуле функцию UTF8ToConsole, тогда fileutil будет не нужен.
Тогда уж можно в новом модуле создать функцию определения количества записей
Можно, просто разделить размер файла на размер одной записи.
Страницы: 1
Читают тему (гостей: 1, пользователей: 0, из них скрытых: 0)