Как удалить одну изпотока


Как удалить одну изпотока

Как удалить одну изпотока

Как удалить одну изпотока




;
;
;
;

Вниз

Удаление данных из потока TMemoryStream 


beglec   (2008-03-24 08:47)

Подскажите пожалуйста как лучше вырезать несколько байт из потока TMemoryStream;

У меня есть несколько потоков в которых хранится разная типизированная информация, но в одном потоке один тип.
я сделал процедуру.

// ------------------------------------------------------------------------------ удаление данных из любого потока
// stream - поток данных
// _id - номер записи в потоке
// _size_record - размер одной записи
procedure EraseRecordInStream(var _stream: TMemoryStream; _id,_size_record: Integer); // _id - это порядковый номер записи в самом потоке а не в базе данных, это сделано в связи с тем, что IDRec неизвестно где определен у записи. Бывает по разному
var stream2: TMemoryStream;
   buf: array of byte; // размер 1 записи
begin
  if _stream.Size=0 then Exit;                                                  // если в потоке нет данных то и удалять нечего
  Stream2  :=TMemoryStream.Create;                                              // создаем поток для копирования данных
  SetLength(buf,_size_record);                                                  // размер одной записи
  _stream.Seek(0,soFromBeginning);                                              // переходи в начало потока
  while _stream.Position<_stream.Size do                                        // пройтись по всему потоку
  begin
     _stream.Read(buf,_size_record);                                            // читаем запись/данные
     // после это строки _size_record получает бешенное значене отличное от входящего, а buf все равно 0 хотя данные в потоке есть, проверял SaveToFile

     if (_stream.Position div _size_record)=_id then Continue;                  // если запись, которая требует удаления то не записываем в новый поток
     Stream2.Write(buf,_size_record);                                           // записываем запись в новый поток
  end;
  _stream.Clear;                                                                // очищаем входящий поток от данных
  _stream.LoadFromStream(Stream2);                                              // загружаем в нужный поток и зановго сформированного потока данных
  Stream2.Free;                                                                 // убиваем временный поток
end;
в чем дело не подскажите ?
Заранее благодарен


TUser    (2008-03-24 08:53)


> я сделал процедуру.
>
> в чем дело не подскажите ?

:9) дело в том, что тебе понадобилась процедура, наверное.

Из возможных подводных камней - надо внимательно вычислять size_record, учитывая, что записи могут быть объявлены со словом packed или без него. Ну, а вообще, я бы не создавал дополнительного потока.


beglec   (2008-03-24 08:59)

дык предложите решение.
я не утверждаю что мое решение идеально.

>> надо внимательно вычислять _size_record
дык я его не вычисляю!
оно просто в Read меняется - вопрос почему?


MBo    (2008-03-24 09:16)

ошибка в работе с дин. массивом

_stream.Read(buf[0],_size_record);    

c write аналогично


beglec   (2008-03-24 09:27)


> MBo

спасибки все сработало


;
;
;
;

Наверх

Память: 0.73 MB
Время: 0.03 c


Источник: http://delphimaster.net/view/2-1206337658



Как удалить одну изпотока фото



Как удалить одну изпотока

Как удалить одну изпотока

Как удалить одну изпотока

Как удалить одну изпотока

Как удалить одну изпотока

Как удалить одну изпотока

Как удалить одну изпотока

Как удалить одну изпотока

Как удалить одну изпотока