чтение данных из файла в дин массив

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
_AND_
Сообщения: 4
Зарегистрирован: 30 окт 2006, 09:57
Контактная информация:

Мне нужно прочитать определенное количество байт из файла в динамический массив. Подскажите пожайлуста
----
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

Код: Выделить всё

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;
С уважением, Lost Angel...
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Можно и "по старинке":

Код: Выделить всё

var F : File;
begin
  assign (F, 'filename.ext');
  reset (F,1);
  BlockRead (F, Buf, Size, Read);
 // Buf - буфер, куда читаются данные
 // Size - размер буфера
 // Read - сколько байт прочитано (это или Size, если конец файла не достигнут, или "остаток" до конца файла)
end;
_AND_
Сообщения: 4
Зарегистрирован: 30 окт 2006, 09:57
Контактная информация:

большое спасибо!!!
----
_AND_
Сообщения: 4
Зарегистрирован: 30 окт 2006, 09:57
Контактная информация:

Токо BlockRead с динамическим массивом не хочет работать, токо со статическим
----
TBackup
Сообщения: 6
Зарегистрирован: 09 окт 2006, 11:24
Контактная информация:

Код: Выделить всё

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
ASUTP - Foreva
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Только обесбашенно их применять не стоит ко всему...
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

_AND_ писал(а):Токо BlockRead с динамическим массивом не хочет работать, токо со статическим
НЕ ВЕРЮ!!! :)
В чем именно проблема? Текст ошибки в студию!
(может, адрес буфера неверно передали?)
_AND_
Сообщения: 4
Зарегистрирован: 30 окт 2006, 09:57
Контактная информация:

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
----
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

_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.

Вроде бы, проблема решается следующим образом. Если вместо

Код: Выделить всё

BlockRead (F, Buf, 10);
написать

Код: Выделить всё

BlockRead (F, Buf[0], 10);
Ответить