Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > TfileStream ругается на маленькие кусочки


Автор: Shurup 15.2.2009, 14:27
Здравствуйте! Опять нужна помощь с файлстримом:
Есть большой файл (примерно 100-200 мб), это куча склеенных вместе файлов (от 20 байт до 10 мегабайт) и мне известна таблица смещений. 
Задача: прочитать в строку выборочный файл, зная его отступ и размер. 

Вот пример кода:
Код

procedure ReadDataFromFile(fromFile:string; aOffset, aSize:Integer);
VAR b:array of char;
begin
  SetLength(b,aSize);
  with TFileStream.create(fromFile, fmShareDenyNone) do
  try
    Seek(aOffset,soFromBeginning);
    Read(b,aSize);
    //result:=...
  finally
    SetLength(b,0);
    Free;
  end;
end;

Оставил только саму процедуру считывания, дабы избежать ошибок присваивания.

Возникла следующая проблема: без вопросов читает файлы больше 1 кб, но выдает access violation при aSize < 1000... Причем точный граничный размер плавает.. последний раз 973 байта прочитало, а вот 972 - уже ругнулось. 

Что это может быть и как этого избежать? 
Версия: Delphi7.
 Заранее спасибо.

Автор: CodeMonkey 15.2.2009, 14:48
Осознайте, чем B отличается от B[0]. И что из этого нужно передавать в Read.

Автор: Alexeis 15.2.2009, 14:50
кто сказал что можно делать так  Read(b,aSize); ?

Динамический массив это указатель. 
Правильно писать в первый элемент. Read(b[0], aSize);

SetLength(b,0); - совсем не нужно делать по выходу. Оно само удалится.

Автор: Shurup 15.2.2009, 16:28
Alexeis, CodeMonkey, Спасибо. 
Да уж, с указателями всегда было туго у меня. Ошибку понял - будем исправляться. 
из того что уже начитался про Дин.Масивы и ДлинныеСтринги:

может мне тогда можно вообще избегать использование array of char и сразу использовать sting?

Код

function ReadDataFromFile(fromFile:string; aOffset, aSize:Integer):string;
VAR b: string; //вместо array of char;
begin
  SetLength(b,aSize);
  with TFileStream.create(fromFile, fmShareDenyNone) do
  try
    Seek(aOffset,soFromBeginning);
    Read(b[1],aSize);  // в b[0]не пустило... говорит, что там длина :) 
    result:=b;
  finally
    Free;
  end;
end;

корректно ли будет использование такой функции? какие трудности могут быть?

Автор: Alexeis 15.2.2009, 16:45
string это вообще, тип который зависит от директив, по умолчанию он тоже указатель такой же как и array of char;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)