Главная страница
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.012 c
3-98023
Vats
2002-09-11 10:58
2002.09.30
Как быстро обновить данные в таблице ADO со статическим курсором


8-98236
Новиков Алексей
2002-05-30 08:44
2002.09.30
Как вставить картинку в gif-формате в Delphi6?


1-98172
Taa
2002-09-17 18:14
2002.09.30
Работа с массивами Variant


3-97951
vJet
2002-09-06 20:01
2002.09.30
Проблема с Table


1-98066
Skywalker
2002-09-19 12:02
2002.09.30
Почему не удаляется?