Вниз
Скачать: CL | DM;

Сохранение массива.   Найти похожие ветки 

← →
Andy BitOff ©   (2004-07-07 17:45) [0]

Здравствуйте, уважаемые.
Возникли проблемы при реализации алгоритма сохранения массива  в файл. Никак не могу дойти КАК?

type
 TDirection = (Up, Down);

type
 TActionForPrint = (OpenFilePR, AllPrint, CurrentPrint, RangePrint);

type
 TRangeSeting = Record
   CurrentPage : integer;
   RangeStart : integer;
   RangeEnd : integer;
   Direction : TDirection;
 end;

type
 TPrintHistory = Record
   DataT : TDateTime;
   PrinterIndex : integer;
   OpenedFile : string;
   Action : TActionForPrint;
   RangeSeting : TRangeSeting;
 end;

var
 HistoryAr: array of TPrintHistory;


Хочу сохранить HistoryAr в файл в виде; размер поля, значение. Сначала хочу все переписать в массив ms : array of Byte; Должно получиться так; DataT сохраняется как 8, дальше 8 байт Double (соответственно дата), затем PrinterIndex – 4, 0,0,0,1 (если соответственно PrinterIndex:=1) и т.д. по всем полям. Но чего-то туплю. Все чего достиг:

 CurSize:=0;
 for i:=0 to Length(HistoryAr)-1 do begin
   SizeItem:=SizeOf(HistoryAr[i].OpenedFile); // тут уже не верно
   SetLength(ms,SizeItem);
   // дальше думаю надо копировать по байту в массив ms, но туплю :(
 end;


← →
Smithson ©   (2004-07-07 17:51) [1]

Зачем так сложно.
Сохраняй в нетипизированный файл (Rewrite(F, 1).
Для типов с известной длиной длину можно и не хранить. А вот для строк - обязательно, увеличишь потом скорость чтения, не придется читать побайтно и искать #0.

Чтение аналогично - порядок следования данных знаешь, читай их себе...


← →
Тимохов ©   (2004-07-07 17:52) [2]

sizeof(string) = 4


← →
Тимохов ©   (2004-07-07 17:52) [3]

т.к. строка (ansistring) есть указатель


← →
Andy BitOff ©   (2004-07-07 17:55) [4]


>Тимохов ©   (07.07.04 17:52) [3]


:) Так я это понимаю. Поэтому и пишу, что не верно.


← →
Digitman ©   (2004-07-07 17:55) [5]


>    SizeItem:=SizeOf(HistoryAr[i].OpenedFile); // тут уже
> не верно


потому что тип String - динамический, и данные этого типа представляют собой 4-байтовый указатель

для сохранения данных типа String следует сначала сохранить Integer-значение strsize = Length(HistoryAr[i].OpenedFile), а следом - данные из буфера, адрес которого равен PChar(HistoryAr[i].OpenedFile), а длина буфера равна strsize


← →
Andy BitOff ©   (2004-07-07 18:00) [6]


>Smithson ©   (07.07.04 17:51) [1]
Зачем так сложно.


Так сложно потому, что это потом надо в реестр сохранить.


← →
Digitman ©   (2004-07-07 18:11) [7]


> Andy BitOff ©   (07.07.04 18:00) [6]


именно в реестр ? и именно в бинарном виде ?
в реестр вообще-то не есть корошо записывать всякий хлам, на то есть файлы, в т.ч. - INI

но если уж приспичило и при этом необязательно хранение данных массива именно в бин.виде, то во всех эти премудростях попросту отпадает необходимость, если воспользоваться классом TRegIniFile - там есть методы для записи любых данных простых типов, и строки там записываются методом WriteString()



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

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.022 c
14-1088137119
CacheMeM
2004-06-25 08:18
2004.07.18
Исходники на Турбо Паскаль


6-1084824796
Федя Мегатронов
2004-05-18 00:13
2004.07.18
Неконнектиться к pop3 .. в чём может быть проблема ?


3-1086930408
Ven
2004-06-11 09:06
2004.07.18
Триггеры


1-1089116928
BBoost
2004-07-06 16:28
2004.07.18
Спец. символы


6-1085044499
OlegM
2004-05-20 13:14
2004.07.18
Почему не запускается TClientSocket




   Наверх