Вниз
Скачать: CL | DM;

Запись динамического массива в файл   Найти похожие ветки 

← →
Юрий К   (2002-09-18 21:05) [0]

Уважаемые мастера! Помогите пожалуйста!
Необходимо записать в файл 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-18 21:13) [1]

BlockWrite(f, buf[0], Length(buf));


← →
ATR   (2002-09-18 21:14) [2]

у тебя же массив. Надо примерно так

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:39) [3]

А почему обязательно поэлементно? Разве нельзя записать весь массив сразу?


← →
Юрий К   (2002-09-18 22:43) [4]

>ATR>у тебя же массив. Надо примерно так...

так получается, но очень долго... а если массив 1000000 элементов? Запись займет минуту не меньше.

>Юрий зотов>А почему обязательно поэлементно? Разве нельзя записать весь массив сразу?

Именно это я и пытаюсь сделать! SizeOf(Buf) возвращает = 4 (!)
Почему? Было бы еще понятно, если б =2. smallint - 2^16= 2 байта.

Существуют ли ограничения на размер буфера?





← →
Юрий Зотов ©   (2002-09-18 23:06) [5]

> Юрий К (18.09.02 22:43)

Внимательнее читайте ответы - см. выше. Правда, я допустил неточность. Правильно так:

BlockWrite(f, buf[0], Length(buf) * SizeOf(SmallInt));

> SizeOf(Buf) возвращает = 4 (!)
Правильно возвращает. Имя динамического массива - это указатель на него. Вот этот адрес Вы и пишете, а не сам массив. В справке на эту тему все есть, с примерами. А сам массив начинается с элемента Buf[0] и занимает Length(buf) * SizeOf(SmallInt) байт.




← →
ATR   (2002-09-18 23:10) [6]

Да я заметил уже, что я стормозил немного. Надо Length использовать, а не SizeOf.


← →
Юрий К   (2002-09-19 00:14) [7]

Большое спасибо! Все получилось! :)



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

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.014 c
1-98061
dimanew
2002-09-19 12:49
2002.09.30
Внутри цикла пишу


1-98157
SergeyDon
2002-09-13 15:00
2002.09.30
Сохранение (чтение) компoнентов в поток?


14-98296
Eduard
2002-09-02 16:02
2002.09.30
Как зарегистрироваться на Борланде ?


8-98240
RealDummy
2002-05-30 02:27
2002.09.30
Как среди множества точек найти похожую на образ фигуру?


8-98239
Сявчик
2002-05-30 21:23
2002.09.30
XP




   Наверх