Форум: "Начинающим";
Текущий архив: 2008.04.20;
Скачать: [xml.tar.bz2];
ВнизУдаление данных из потока TMemoryStream Найти похожие ветки
← →
beglec (2008-03-24 08:47) [0]Подскажите пожалуйста как лучше вырезать несколько байт из потока 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) [1]
> я сделал процедуру.
>
> в чем дело не подскажите ?
:9) дело в том, что тебе понадобилась процедура, наверное.
Из возможных подводных камней - надо внимательно вычислять size_record, учитывая, что записи могут быть объявлены со словом packed или без него. Ну, а вообще, я бы не создавал дополнительного потока.
← →
beglec (2008-03-24 08:59) [2]дык предложите решение.
я не утверждаю что мое решение идеально.
>> надо внимательно вычислять _size_record
дык я его не вычисляю!
оно просто в Read меняется - вопрос почему?
← →
MBo © (2008-03-24 09:16) [3]ошибка в работе с дин. массивом
_stream.Read(buf[0],_size_record);
c write аналогично
← →
beglec (2008-03-24 09:27) [4]
> MBo
спасибки все сработало
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.04.20;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.041 c