Форум: "Основная";
Текущий архив: 2003.10.06;
Скачать: [xml.tar.bz2];
Вниз
Запись массива на диск Найти похожие ветки
← →
Eugene_ (2003-09-22 16:38) [0]Здравствуйте!
Возникла такая проблема...
Необходимо записать массив на диск. Массив выглядит следующим образом:
type
Data=record
Numb:Integer;
Name:String;
Time:Variant;
Volume:String;
Screen:String;
Other:String;
end;
type
TArrayOfData=Array of Data;
var
ArrayOfData: TArrayOfData;
Далее при создании формы устанавливается длина массива и он заполняется.
Table.RecordCount=164 записи.
SetLength(ArrayOfData,Table.RecordCount+1);
for i:=1 to Table.RecordCount do begin
Table.RecNo:=i;
ArrayOfData[i].Numb:=Table.FieldByName("Numb").AsInteger;
ArrayOfData[i].Name:=Table.FieldByName("Name").AsString;
ArrayOfData[i].Time:=Table.FieldByName("Time").Value;
ArrayOfData[i].Volume:=Table.FieldByName("Volume").AsString;
ArrayOfData[i].Screen:=Table.FieldByName("Screen").AsString;
ArrayOfData[i].Other:=Table.FieldByName("Other").AsString;
end;
А для записи массива на диск я пишу так:
with TFileStream.Create(ExtractFilePath(Application.ExeName)+"\Data\SaveData.dat", fmCreate) do begin
Write(ArrayOfData,Length(ArrayOfData));
Free;
end;
... и получаю на диске файл размером 4 байта! Что я не так делаю?
← →
Sam Stone (2003-09-22 17:17) [1]Создай файл типа File Of Data и пиши туда
← →
icWasya (2003-09-22 17:26) [2]не путай указатель на данные и сами данные
в D6 String - это указатель на данные
Динамический массив - это тоже указатель
Variant - вообще непойми чего
как пишутся и читаются структурированные данные лучше всего посмотреть модуль Classes , Классы TReader и TWriter. А потом задавай вопросы
← →
PVOzerski (2003-09-22 17:43) [3]Лучше всего - делай нетипизированный файл и сбрасывай в него через BlockWrite c начального элемента массива. Кстати, в Вашем примере есть ошибочка: должно бы быть
for i:=0 to Table.RecordCount-1 do begin
так как динамические массивы отсчитываются с 0-го элемента.
итак, я бы использовал вот такое:
var
f:file;
....
reset(f,1);
blockwrite(f,ArrayOfData[0],Table.RecordCount*sizeof(Data));
Через стримы, конечно, тоже можно, но: 1) надо-таки как переменную передавать не массив, а его 0-й элемент; 2) исправить ошибку с циклом (см. выше).
Btw, с вариантами шутки вообще плохи. Вы представьте себе, что будет, если полю Time присвоено строковое значение, а Вы сбросите его в файл - туда попадет указатель на начало строки, именно для адресного пространства данного сеанса данной программы.
← →
icWasya (2003-09-22 17:48) [4]to PVOzerski © (22.09.03 17:43) [3]
с учётом того, что в DATA есть String и Variant - то ТАК blockwrite(f,ArrayOfData[0],Table.RecordCount*sizeof(Data)); делать нельзя. см [2]
← →
BOA_KAA (2003-09-22 18:00) [5]
> icWasya © (22.09.03 17:48) [4]
Это почему же?
Если работать через TFileStream, то для String надо просто дополнительно запоминать ее длину, а затем содержимое.
Для варианта сложнее. Но если сохраняешь сам, то должен знать, что именно представляет собой данный вариант. Поэтому сначала нужно сохранить информацию о том, чем он является, а потом содержимое
← →
PVOzerski (2003-09-22 18:05) [6]2icWasya © (22.09.03 17:48) [4]
Согласен. Так что для простоты надо бы брать shortstring. Или же отдельно обрабатывать сохранение/загрузку строк. Я бы, пожалуй, вообще сделал бы массив не записей, а объектов/классов и сделал бы им методы для сохранения и чтения длинных строк и вариантов.
← →
Eugene_ (2003-09-23 16:50) [7]Ребята ... всем спасибо за ответы
Я из них немного понял :-)))
Просто, видимо я не туда залез (пойду еще что-нибудь почитаю) ... сорри
← →
Amoeba (2003-09-23 18:19) [8]Это првильно! Сперва стоит почитать букварь, а потом приниматься за программирование.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.10.06;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.011 c