Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
6-18505
Lahtak
2003-08-11 12:22
2003.10.06
загрузка с сервера на сервер


6-18521
Lizard
2003-08-07 10:06
2003.10.06
Как сервером на удал-м. компе, передать инфу о файлах клиенту ?


14-18595
panov
2003-09-17 18:59
2003.10.06
Ну что, бета-тестер... слабо теперь?


1-18395
@andrew
2003-09-25 20:39
2003.10.06
ClipBoard. ВСЕМ ПРИВЕТ! Подскажите, пжл.


14-18622
IGOREK
2003-09-17 17:30
2003.10.06
Посоветуйте русско-украинский переводчик...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский