![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запись динамического массива в файл [D5, WinXP]
Юрий К © (2002-09-18 21:05:00)Уважаемые мастера! Помогите пожалуйста!
Необходимо записать в файл f:file of byte Динамический массив buf:array of smallint; пишу:
type
TMy=record
X1,X2:real;
X3,X4:array[0..3]of Char;
end;
procedure My;
var
i:integer;
f:file of byte;
M:TMy;
buf:array of smallint;
begin
//... запись значений в M
SetLength(buf,а*b); //приблизительно 70000
//... заполнение массива Buf
AssignFile(f,"C:\temp");
Rewrite(f);
BlockWrite(f,M,SizeOf(M));
BlockWrite(f,buf,SizeOf(buf));
closeFile(f);
end;
данные в записи М записываются нормально, а вот из buf только четыре байта... Где я ошибся?...
Юрий К (2002-09-19 00:14:00) [1]Большое спасибо! Все получилось! :)
ATR (2002-09-18 23:10:00) [2]Да я заметил уже, что я стормозил немного. Надо Length использовать, а не SizeOf.
Юрий Зотов (2002-09-18 23:06:00) [3]> Юрий К (18.09.02 22:43)
Внимательнее читайте ответы - см. выше. Правда, я допустил неточность. Правильно так:
BlockWrite(f, buf[0], Length(buf) * SizeOf(SmallInt));
> SizeOf(Buf) возвращает = 4 (!)
Правильно возвращает. Имя динамического массива - это указатель на него. Вот этот адрес Вы и пишете, а не сам массив. В справке на эту тему все есть, с примерами. А сам массив начинается с элемента Buf[0] и занимает Length(buf) * SizeOf(SmallInt) байт.
Юрий К (2002-09-18 22:43:00) [4]>ATR>у тебя же массив. Надо примерно так...
так получается, но очень долго... а если массив 1000000 элементов? Запись займет минуту не меньше.
>Юрий зотов>А почему обязательно поэлементно? Разве нельзя записать весь массив сразу?
Именно это я и пытаюсь сделать! SizeOf(Buf) возвращает = 4 (!)
Почему? Было бы еще понятно, если б =2. smallint - 2^16= 2 байта.
Существуют ли ограничения на размер буфера?
Юрий Зотов (2002-09-18 21:39:00) [5]А почему обязательно поэлементно? Разве нельзя записать весь массив сразу?
ATR (2002-09-18 21:14:00) [6]у тебя же массив. Надо примерно так
AssignFile(f,"C:\temp");
Rewrite(f);
BlockWrite(f,M,SizeOf(M));
for i := 0 to Length(buf) - 1 do
BlockWrite(f, buf[i], SizeOf(buf[i]));
closeFile(f);
Юрий Зотов (2002-09-18 21:13:00) [7]BlockWrite(f, buf[0], Length(buf));