Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.30;
Скачать: 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 вся ветка

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

Наверх




Память: 0.48 MB
Время: 0.013 c
14-98313
Yuri Btr
2002-09-04 09:23
2002.09.30
Разрезание .exe на составляющие файлы


3-98013
Lego
2002-08-31 10:01
2002.09.30
Помогите plz написать покрасивее :)


1-98208
LAndrew
2002-09-15 22:07
2002.09.30
ListView и контекстное меню как в проводнике, как сделать?


3-98024
vitnt2000
2002-09-11 11:49
2002.09.30
Сортировка данных


14-98354
nick_vstu
2002-09-05 11:00
2002.09.30
CGI. Как мне заставить свой комп имполнять CGI.