Страница 1 из 1

Произвольный доступ к TReadBufStream

СообщениеДобавлено: 15.08.2016 14:13:21
shyub
Не получается получить произвольный доступ к буферу файлового потока.
Код: Выделить всё
var
  Stream: TFileStream;
  BufStr: TReadBufStream;
I: Integer;
begin
  Stream:=TFileStream.Create('My.tmp', fmOpenRead);
  BufStr:=TReadBufStream.Create(Stream);
  BufStr.Read(I, 4);
  .......
  BufStr.Seek(0,soBeginning); // Возникает ошибка.
end;

Почему-то при вызове ф-ции Seek() возникает ошибка. Что у меня не так и как с этим бороться?

Re: Произвольный доступ к TReadBufStream

СообщениеДобавлено: 15.08.2016 14:31:38
runewalsh
Пишут, что он поддерживает только Seek вперёд, который эмулируется чтением и отбрасыванием нужного количества байт. Можешь не использовать, можешь написать своего наследника TBufStream (это несложно). Вообще странно, что не поддерживается изкоробки, ведь проблема вроде как исчерпывается, если ресетнуть или перечитать буфер после Seek за его пределы.

P.S. Я ещё слышал, что если ты не проверяешь результат функции, то необходимо использовать ReadBuffer/WriteBuffer, которые бросают исключения, тогда как Read/Write тихо возвращают прочитанное количество байт, которое может быть меньше запрошенного. Очень плохо сделали, конечно, нужно было назвать Read и TryRead.

Re: Произвольный доступ к TReadBufStream

СообщениеДобавлено: 15.08.2016 16:12:07
Дож
Вообще странно, что не поддерживается изкоробки, ведь проблема вроде как исчерпывается, если ресетнуть или перечитать буфер после Seek за его пределы.

Как ресетнуть, если субстрим — это, например, поток из сокета и после первого чтения данные утрачиваются?

Re: Произвольный доступ к TReadBufStream

СообщениеДобавлено: 15.08.2016 16:16:22
runewalsh
Вот субстрим пусть и бросает исключение, если не поддерживает операцию. С каких пор универсальный класс необходимо кастрировать до наименьшего общего знаменателя всего, что ему предполагается поддерживать.