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

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

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

Сообщение shyub » 15.08.2016 14:13:21

Не получается получить произвольный доступ к буферу файлового потока.
Код: Выделить всё
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() возникает ошибка. Что у меня не так и как с этим бороться?
shyub
постоялец
 
Сообщения: 112
Зарегистрирован: 25.11.2014 23:15:19

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

Сообщение runewalsh » 15.08.2016 14:31:38

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

P.S. Я ещё слышал, что если ты не проверяешь результат функции, то необходимо использовать ReadBuffer/WriteBuffer, которые бросают исключения, тогда как Read/Write тихо возвращают прочитанное количество байт, которое может быть меньше запрошенного. Очень плохо сделали, конечно, нужно было назвать Read и TryRead.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25

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

Сообщение Дож » 15.08.2016 16:12:07

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

Как ресетнуть, если субстрим — это, например, поток из сокета и после первого чтения данные утрачиваются?
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

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

Сообщение runewalsh » 15.08.2016 16:16:22

Вот субстрим пусть и бросает исключение, если не поддерживает операцию. С каких пор универсальный класс необходимо кастрировать до наименьшего общего знаменателя всего, что ему предполагается поддерживать.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 10

Рейтинг@Mail.ru