Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.032 c
14-1101990965
by
2004-12-02 15:36
2004.12.19
ECO, MDA и прочие новомодные технологии. Использует ли кто их?


14-1101902473
margel
2004-12-01 15:01
2004.12.19
Люди! Как писать DVD, "+" или "-"???


3-1101152147
eugene56
2004-11-22 22:35
2004.12.19
Interbase&Internet


14-1101437102
Думкин
2004-11-26 05:45
2004.12.19
С днем рождения! 26 ноября


11-1073121423
nsvi
2004-01-03 12:17
2004.12.19
ComboBox





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский