Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2009, 12:13   #1
Bayazet
Форумчанин
 
Регистрация: 08.12.2008
Сообщений: 156
По умолчанию работа с бинарным файлом

у меня есть след.структура данных:
Код:
  FBlob = record
    X : TCoord;
    Y : TCoord;
    NCont : integer;
  end;
  TArFBlob = array of FBlob;
мне необходимо загрузить ее в бинарный файл и соотв.выгрузить
мой код для загрузки:
Код:
Procedure INBIN(BAr : TArFBlob);
  var
    Bfile : File;
begin
    AssignFile(Bfile, 'c:\temp.bf');
    Rewrite(Bfile, SizeOf(FBlob));
       BlockWrite(Bfile, BAr, dots);   //dots - количество записей
    CloseFile(Bfile);
end;
и код для выгрузки:
Код:
Procedure OUTBIN(out BAr : TARFBlob);
var
  Bfile : File;
  i : integer;
begin
  AssignFile(Bfile, 'c:\temp.bf');
{  ShowMessage(IntToStr(SizeOf(FBLob)) + ' ' + IntToStr(SizeOf(integer)) + ' ' + IntToStr(SizeOf(TCoord)));}
  Reset(Bfile, SizeOf(FBlob));
  i := -1;
  while not Eof(Bfile) do
  begin
    i := i+1;
    SetLength(BAr, i+1);
    BlockRead(Bfile, BAr[i], SizeOf(FBlob));   
  end;
  DeleteFile('c:\temp.bf');
  CloseFile(Bfile);
end;
ругается на указатели и возвращает чушь.
пробовал вместо
BlockRead(Bfile, BAr[i], SizeOf(FBlob));
писать
BlockRead(Bfile, BAr[i].X, SizeOf(TCoord));
BlockRead(Bfile, BAr[i].Y, SizeOf(TCoord));
BlockRead(Bfile, BAr[i].NCont, SizeOf(integer));

разницы нет.
НО. вот что интересно, про запросе SizeOf(FBlob) возвращается 24.
А если отдельно запросить SizeOf(integer) и дважды SizeOf(TCoord), получается в сумме 20..
помогите разобраться, как все-таки считать?
Bayazet вне форума Ответить с цитированием
Старый 17.03.2009, 13:10   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А ругается скорее всего на то что массив у тя динамический.
Попробуй в цикле его писать:
Код:
reset(Bfile); // тут размер не указывай в этом случае.
for i:=low(Bar) to high(bar) do
 write(Bfile,Bar[i]);
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.03.2009, 14:38   #3
Bayazet
Форумчанин
 
Регистрация: 08.12.2008
Сообщений: 156
По умолчанию

если кому интересно, то вот как надо было делать:
(я напутал с передаваемыми параметрами для Block[Read/Write])
Код:
procedure INBIN(BAr : TArFBlob);
  var
    i, j : integer;
    Bfile : File;
begin
  AssignFile(Bfile, 'C:\temp.crd');
  Rewrite(Bfile, SizeOf(FBlob));
  For i := 0 to Length(BAr)-1 do
    BlockWrite(Bfile, BAr[i], 1);
  CloseFile(Bfile);
end;
//********************************

function OUTBIN: TArFBlob;
var
  Bfile : File;
  count : TCoord;
  i : integer;
begin
  AssignFile(Bfile, 'C:\temp.crd');  
  Reset(Bfile, SizeOf(FBlob));
  i := -1;
  while not Eof(Bfile) do
  begin
    i := i+1;
    SetLength(result, i+1);
    BlockRead(Bfile, result[i], 1);
  end;
  CloseFile(Bfile);
end;
Bayazet вне форума Ответить с цитированием
Старый 17.03.2009, 15:37   #4
Bayazet
Форумчанин
 
Регистрация: 08.12.2008
Сообщений: 156
По умолчанию

ну а вот этого перемещения я совсем не понял о.О
Bayazet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа с бинарным файлом Геннадий Win Api 8 22.10.2009 18:49
Делфи - работа с файлом Лунатик222 Помощь студентам 8 23.01.2009 22:14
Работа с файлом в C Mishka Помощь студентам 2 22.07.2008 13:28
Работа с текстовым файлом Vasya Помощь студентам 28 24.01.2008 01:15
Работа с файлом на С++ For Dos KORT Помощь студентам 2 06.10.2007 21:20