Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TfileStream ругается на маленькие кусочки, а большие читает без проблем 
V
    Опции темы
Shurup
Дата 15.2.2009, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 16.10.2006

Репутация: нет
Всего: нет



Здравствуйте! Опять нужна помощь с файлстримом:
Есть большой файл (примерно 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.
 Заранее спасибо.

PM MAIL   Вверх
CodeMonkey
Дата 15.2.2009, 14:48 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



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


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Alexeis
Дата 15.2.2009, 14:50 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



кто сказал что можно делать так  Read(b,aSize); ?

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

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Shurup
Дата 15.2.2009, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 16.10.2006

Репутация: нет
Всего: нет



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;

корректно ли будет использование такой функции? какие трудности могут быть?
PM MAIL   Вверх
Alexeis
Дата 15.2.2009, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1104 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.