Как частично прочитать из TStringStream, освободить прочитанные данные из потока и сохранить остальные (непрочитанные данные)? - PullRequest
2 голосов
/ 21 ноября 2011

Что я хочу сделать: предположим, у меня есть TStringStream, который просто читает строку из 100 символов.Если я вызову .ReadString (50), я получу первые 50 символов этого потока, и его курсор будет помещен на позицию 51.

Мой вопрос: как мне бросить символы 1 в50 в этом потоке быстрым и чистым способом?Я хочу прочитать остальное (от 51 до 100) позже.

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 21 ноября 2011

Вы не можете сделать это. Если вам действительно нужно это сделать, вы должны написать свой собственный класс, который реализует потоковый интерфейс и который позволит вам обрабатывать некоторые данные постепенно и бесплатно, что бы вы ни хотели освободить. Обратите внимание, что вы сможете просмотреть данные только один раз, поскольку теперь вы удалили свои данные. Таким образом, поиск начала снова станет невозможным, и ваша текущая «позиция» потока будет ложью.

Короче, звучит так, как будто ты запутался.

2 голосов
/ 21 ноября 2011

Вы не можете делать то, что надеетесь сделать. Данные строкового потока - это строка Delphi, которая хранится в виде одного блока памяти. Блоки памяти атомарные, их нельзя разделить. Вы не можете освободить часть блока памяти.

Если вам действительно нужно вернуть память диспетчеру памяти, вам следует создать новую строку с удаленными уже обработанными данными. Затем вы можете заново создать поток строк с этим новым вводом и уничтожить предыдущий поток строк.

Сказав это, трудно понять, что это делает что-то большее, чем увеличение фрагментации памяти. Если размеры используемой памяти достаточно велики, и если поток строк сохраняется достаточно долго, то это может быть разумным подходом. В противном случае это звучит как попытка оптимизации, которая на самом деле снизит производительность.

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

1 голос
/ 21 ноября 2011

Если я правильно вас понял, что пропустить вперед в потоке?

Вы можете сделать:

  Str.Position := Str.Position + 50;

Или вот так:

  Str.Seek(50,TSeekOrigin.soCurrent);
...