Страница 1 из 1
чтение данных из файла в дин массив
Добавлено: 30 окт 2006, 10:16
_AND_
Мне нужно прочитать определенное количество байт из файла в динамический массив. Подскажите пожайлуста
Добавлено: 30 окт 2006, 10:40
LAngel
Код: Выделить всё
var
mass: array of byte;
kolvo: Integer;
pos: Integer;
begin
pos := 0;
kolvo := 15;
with TFileStream.Create('filename.ext', fmOpenRead) do
try
if Size < (kolvo + pos) then Raise Exception.Create('нет столько в файле');
Position := pos;
SetLength(mass, kolvo);
Read(mass[0], kolvo);
finally
Free;
end;
end;
Добавлено: 30 окт 2006, 11:48
BBB
Можно и "по старинке":
Код: Выделить всё
var F : File;
begin
assign (F, 'filename.ext');
reset (F,1);
BlockRead (F, Buf, Size, Read);
// Buf - буфер, куда читаются данные
// Size - размер буфера
// Read - сколько байт прочитано (это или Size, если конец файла не достигнут, или "остаток" до конца файла)
end;
Добавлено: 30 окт 2006, 19:47
_AND_
большое спасибо!!!
Добавлено: 30 окт 2006, 22:57
_AND_
Токо BlockRead с динамическим массивом не хочет работать, токо со статическим
Добавлено: 31 окт 2006, 07:36
TBackup
Код: Выделить всё
uses ...,Windows,...
Buffer : array of Byte;
SetLength(Buffer,FSizeOfBuf);
...
FHFile := CreateFileA(PChar(nFile),GENERIC_READ,
FILE_SHARE_READ or FILE_SHARE_WRITE,Nil,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
rResult := ReadFile(FHFile,Buffer[0],FSizeOfBuf,BytesRead,Nil);
if (rResult <> True) or (BytesRead <> FSizeOfBuf) then
begin
...
Finalize(Buffer);
Если хочешь то можно и так еще извратиться:
type
PMyRecord = ^TMyRecord;
TMyRecord = record
{$A1+}
CoolInteger : Integer;
RulesString : string;
{$A1-}
end;
var
pArray : PMyRecord;
begin
pArray := PMyRecord(Buffer);
Если надо подвинуть указатель на след. элемент, то:
pArray := PMyRecord(Longint(pArry) + SizeOf(TMyRecord));
Можно еще проще:
pArray : array of TMyRecord;
SetLengtyh(pArray, кол-во экземпляров);
но лучше учись работать с указателями, это очень мощное средство!
и по урлу:
http://www.delphikingdom.com/asp/answer ... swer=45926
Добавлено: 31 окт 2006, 09:13
Duncon
Только обесбашенно их применять не стоит ко всему...
Добавлено: 31 окт 2006, 10:10
BBB
_AND_ писал(а):Токо BlockRead с динамическим массивом не хочет работать, токо со статическим
НЕ ВЕРЮ!!!

В чем именно проблема? Текст ошибки в студию!
(может, адрес буфера неверно передали?)
Добавлено: 31 окт 2006, 19:56
_AND_
To BBB
я делаю вот так:
var F : File;
buf:array of smallint;
begin
setlength(buf,100);
assignfile (F, '1.dat');
reset (F,1);
BlockRead (F, Buf, 10);
end;
а в итоге выдает сообщение EAcessViolation
Добавлено: 01 ноя 2006, 09:47
BBB
_AND_,
Попробовал твой текст, действительно некузяво получается. (Хотя по эксепшену у меня не падает, но и с содержимым буфера странности).
Полагаю, ключ к тому, что при таком написании [BlockRead (F, Buf, 10)] не работает, в этих строках HELP-а:
Dynamic-array variables are implicitly pointers and are managed by the same reference-counting technique used for long strings.
То есть, в таком написании, ты передаешь пр-ре BlockRead не буфер, а, де-факто, переменную-адрес буфера.
В то же время HELP далее говорит:
Do not apply the dereference operator (^) to a dynamic-array variable or pass it to the New or Dispose procedure.
Вроде бы, проблема решается следующим образом. Если вместо
написать