Форум: "Основная";
Текущий архив: 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