Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.19;
Скачать: CL | DM;

Вниз

Сохранения в файл   Найти похожие ветки 

 
Profi ©   (2004-12-02 00:49) [0]

Столкнулся тут с проблемой! Как за раз сохранить динамический список в файл?


 
GuAV ©   (2004-12-02 00:53) [1]

Какой список ? и список чего ?

и что значит "за раз" ??

Вот я скинул всё в TMemoryStream, а потом его одним BlockWrite в файл. Это за раз ?


 
Profi ©   (2004-12-02 00:56) [2]

GuAV ©   (02.12.04 0:53) [1]
Ага, можно через TMemoryStream, вот только ни разу не юзал. Кинь маленький примерчик, плз!


 
GuAV ©   (2004-12-02 01:07) [3]

S := TMemoryStream.Create;
try
 S.WriteBuffer(MyVar, SizeOf(MyWar));
 Image1.Picture.Bitmap.SaveToStream(S);
 Memo1.Lines.SaveToStream(S);
 BlockWrite(F, S.Memory^,  S.Size);
finally
 S.Free;
end;


Лучше ответь на вопросы в [1] + вопрос:
для чего именно "за раз" ?


 
Gero ©   (2004-12-02 01:07) [4]

System.Write


 
Profi ©   (2004-12-02 01:13) [5]

GuAV ©   (02.12.04 1:07) [3]
За одну запись! Без циклов!


 
GuAV ©   (2004-12-02 01:15) [6]

ещё раз: что есть дин. список ? что есть элемент списка ?


> За одну запись! Без циклов!

зачем ?


 
Profi ©   (2004-12-02 01:17) [7]

GuAV ©   (02.12.04 1:15) [6]
type
eluk=^el;
el=record
dx,dy:extended;
sl:eluk;
end;
var
gol,hv,pop:eluk;


В списке более 1000 элементов, поэтому надо его запихивать за раз, а не о элементно!


 
GuAV ©   (2004-12-02 01:21) [8]

А почему бы не перестроить список так:
type
 el = record
   dx,dy:extended;
 end;

 TMyist = array of el

?


 
Profi ©   (2004-12-02 01:22) [9]

GuAV ©   (02.12.04 1:21) [8]
Разве можно динамический массив в файл сохранить?


 
GuAV ©   (2004-12-02 01:26) [10]

Profi ©   (02.12.04 1:22) [9]
Разве можно динамический массив в файл сохранить?


Да. Причём почти "за раз" - за 2 раза.
L := Length(A);
BlockWrite(F, L, SizeOf(L));
BlockWrite(F, A[0], L);


 
Profi ©   (2004-12-02 01:29) [11]

GuAV ©   (02.12.04 1:26) [10]
Опять же, я точно не знаю, сколько будет элементов, следовательно нужен список. Конечно можно потом его в массив скопировать, но это лишние телодвижения, там и так скорость ниже некуда.


 
GuAV ©   (2004-12-02 01:30) [12]

GuAV ©   (02.12.04 1:26) [10]
L := Length(A);
BlockWrite(F, L, SizeOf(L));
BlockWrite(F, A[0], L);


L := Length(A);
BlockWrite(F, L, SizeOf(L));
BlockWrite(F, A[0], L * SizeOf(A[0]));


Да и длину можно не сохранять, если известна, или если в файле ничего кроме этого массива её можно взять из размера файла.


 
GuAV ©   (2004-12-02 01:33) [13]

Profi ©   (02.12.04 1:29) [11]
там и так скорость ниже некуда.


Возможно, именно потому что выделяешь память для каждого элемента.


 
GuAV ©   (2004-12-02 01:35) [14]

http://www.delphimaster.ru/articles/dyntable/index.html


 
Profi ©   (2004-12-02 01:37) [15]

GuAV ©   (02.12.04 1:33) [13]
Ладно, завтра попарюсь, а сейчас спать. На работу завтра.


 
Gero ©   (2004-12-02 01:43) [16]

Я только не понял, чем не подходит цикл.


 
GuAV ©   (2004-12-02 01:46) [17]

ачто тут непонятного. если проблемы с быстродействием, то виноваты естественно циклы. :-)


 
TButton ©   (2004-12-02 07:44) [18]


> виноваты естественно циклы. :-)

Я вас попрошу птичку нашу не обижать© Кот Матроскин


 
ЮЮ ©   (2004-12-02 08:00) [19]

>Опять же, я точно не знаю, сколько будет элементов, следовательно нужен список

Почему, думешь, массив называют динамическим

>За одну запись! Без циклов!

Невозможно, т.к. только в цикле можно найти реальное мксто в памяти очередного record


 
Anatoly Podgoretsky ©   (2004-12-02 09:20) [20]

GuAV ©   (02.12.04 01:07) [3]
S := TMemoryStream.Create;
try
S.WriteBuffer(MyVar, SizeOf(MyWar));
Image1.Picture.Bitmap.SaveToStream(S);
Memo1.Lines.SaveToStream(S);
BlockWrite(F, S.Memory^,  S.Size);
finally
S.Free;
end;

А это сводится до одной строчки Memo1.Lines.SaveToFile(FN);

Profi ©   (02.12.04 01:17) [7]
А никакого смысла нет в запихивать указатели в файл.


 
GuAV ©   (2004-12-02 14:22) [21]

Anatoly Podgoretsky ©   (02.12.04 9:20) [20]

Я понимаю, но автор хотел одной записью в файл через BlockWrite :)


 
Profi ©   (2004-12-02 17:53) [22]

Да я уже на работе все понял! Спасибо за советы (особенно: "указатели в файл")!


 
Profi ©   (2004-12-02 22:11) [23]

Блин, все равно не выходит!
ТЗ: есть пять строк, неопределенное кол-во (но более 2048) элементов extended, ровно в два раза меньше integer, и еще штук двадцать extended. Как все это запихнуть в один файл? Ваши мысли!


 
GuAV ©   (2004-12-02 22:31) [24]

Profi ©   (02.12.04 22:11) [23]
неопределенное кол-во (но более 2048) элементов extended, ровно в два раза меньше integer, и еще штук двадцать extended. Как все это запихнуть в один файл? Ваши мысли!


Дин массив из записей из двух extended и одного Integer. Если нужно записывать элементы в массив а их число неизвестно, то установить его длинц в 1024. Когда станет ясна длина, установить длину к актуальному значению.
Записывать в файл BlockWrite или TFileStream.WriteBuffer. длину лучше тоже записать.


 
GuAV ©   (2004-12-02 22:34) [25]

Кстати 2048 extended - это 2048*12, 1024 integer это 1024*4... не так уж много, можно и как со статическим массивом.

Можно ещё массив extended отдельно, массив Integer отдельно.


 
Profi ©   (2004-12-02 22:34) [26]

GuAV ©   (02.12.04 22:31) [24]
А со string что делать?


 
GuAV ©   (2004-12-02 22:36) [27]

Profi ©   (02.12.04 22:34) [26]
А со string что делать?


сколько, какой длины ?


 
TButton ©   (2004-12-02 22:44) [28]


> А со string что делать?

выкини его сейчас же!
и не забудь вымыть руки!
тащут сюда всякую гадость...


 
Profi ©   (2004-12-03 00:43) [29]

GuAV ©   (02.12.04 22:36) [27]
Опять же таки, не известно! Может быть любой! У меня уже голова пухнит, как все это совместить!


 
GuAV ©   (2004-12-03 00:55) [30]

Profi ©   (03.12.04 0:43) [29]
Может быть любой!


Хорошо. Сколько ? Одна ? Или опять неизвесно сколько ?


 
Profi ©   (2004-12-03 00:56) [31]

GuAV ©   (03.12.04 0:55) [30]
Я же сказал пять!


 
GuAV ©   (2004-12-03 01:04) [32]

ок.
тогда пиши размер перед строкой.
L := Length(S);
BlockWrite(F, L, SizeOf(S));
BlockWrite(F, A[0], L * SizeOf(Char));


 
Profi ©   (2004-12-03 01:07) [33]

GuAV ©   (03.12.04 1:04) [32]
Пойми, мне все это надо запихнуть в один файл! И строки, и списки!


 
GuAV ©   (2004-12-03 01:27) [34]

Я понял. Вот так и пиши:
-длина массива extended
-сам массив
-длина строки
-строка
...

читать так:
BlockRead(F, L, SizeOf(S));
SetLength(S, L);
BlockRead(F, S[0], L * SizeOf(S[0]));



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

Текущий архив: 2004.12.19;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.023 c
1-1102303284
Anonim
2004-12-06 06:21
2004.12.19
Проблемы с WM_DEVICECHANGE...


1-1102331011
fuzzy
2004-12-06 14:03
2004.12.19
Как нужно работать с автосоздаваемыми CheckBox ами?


14-1101527970
Думкин
2004-11-27 06:59
2004.12.19
С днем рождения! 27 ноября


4-1099347908
Ded Moroz
2004-11-02 01:25
2004.12.19
Приложение не реагирует на сообщения


1-1102259654
Гаврилов В.А.
2004-12-05 18:14
2004.12.19
Как вставить в Listview таблицу базы данных