![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чтение и запись строки в Stream
vidiv © (2006-04-12 09:25:00)Можно ли так производить запись и чтение строки из Stream-а:
procedure SaveStringToStream(Str:string; Stream:TStream);
var L:integer;
begin
L := length(Str);
Stream.WriteBuffer(L, SizeOf(L));
Stream.WriteBuffer( Str[1], L);
end;
function LoadStringFromStream(Stream:TStream):string;
var L:integer;
begin
Stream.ReadBuffer(L, SizeOf(L));
SetLength(Result, L);
Stream.ReadBuffer( Result[1], L);
end;
Больше всего интересует выделенный фрагмент
Anatoly Podgoretsky (2006-04-20 08:42:00) [1]TStream (20.04.06 03:34) [34]
Песочница в соседнем квартале.
Германн (2006-04-20 04:07:00) [2]
> Джо © (20.04.06 03:53) [35]
А что, вчера тоже был повод?
Ну так купиться на "подколку" некоего TStream'a!
Джо (2006-04-20 03:53:00) [3]> [34] TStream (20.04.06 03:34)
> Короче никто не знает где счётчик ссылок? Если не знаете,
> то какие же вы мастера после этого?
Тебе не кажется, что это уже хамством попахивает?
Счетчик ссылок на строку хранится по отрицательному смещению -8 от начала области памяти, где размещена строка. Занимает 4 байта (Integer).
TStream (2006-04-20 03:34:00) [4]Короче никто не знает где счётчик ссылок? Если не знаете, то какие же вы мастера после этого?
TStream (2006-04-19 07:30:00) [5]> MBo
> может сложиться, что счетчик ссылок не единичный.
А где показывается колличество ссылок? Как посмотерть этот счётчик?
И есть ли разница между Write и WriteBuffer?
Apavl (2006-04-18 15:39:00) [6]супер, спасибо!
Slym (2006-04-18 15:35:00) [7]SaveStringToStream('dsgf dsf g', Stream);
Stream.Position:=0;
ShowMessage(LoadStringFromStream(Stream));
Apavl (2006-04-18 15:34:00) [8]да
SaveStringToStream('dsgf dsf g', Stream);
ShowMessage(LoadStringFromStream(Stream));
Slym (2006-04-18 15:33:00) [9]а ты чтонибудь положил в "коробочку", чтобы чтонибудь взять?
Apavl (2006-04-18 15:30:00) [10]Стал использовать TStringStream. Ошибка исчезла, но появилась другая.
При вызове
function LoadStringFromStream(Stream:TStream):string;
var L:integer;
begin
Stream.ReadBuffer(L, SizeOf(L)); --здесь ошибка stream read error.
SetLength(Result, L);
if L > 0 then
Stream.ReadBuffer(PChar(Result)^, L)
else
Result := '';
end;
Slym (2006-04-18 15:26:00) [11]Apavl (18.04.06 15:17) [26]
Да, ошибка абстрактная. Так как ее исправить?
не исправлять надо, а избегать:
не создавать абстрактных классов коим является TStream,
пользуй TMemoryStream, TStringStream, всякие TFileStream
Apavl (2006-04-18 15:17:00) [12]Да, ошибка абстрактная. Так как ее исправить?
Slym (2006-04-18 15:15:00) [13]TStream - абстрактный класс...
и ошибка скорее всего "абстрактная" :)
Apavl (2006-04-18 15:12:00) [14]Я подгядел код и делаю так
procedure SaveStringToStream(Str:string; Stream:TStream);
var L:integer;
begin
L := length(Str);
Stream.WriteBuffer(L, SizeOf(L)); -<< Здесь выскакивает ошибка. Почему?
if L > 0 then
Stream.WriteBuffer(PChar(Result)^, L);
end;
procedure TForm1.Button5Click(Sender: TObject);
var
Stream: TStream;
begin
Stream := TStream.Create;
SaveStringToStream('22 33 44', Stream);
end;
Lamer@fools.ua (2006-04-18 09:43:00) [15]>> MBo © (12.04.06 13:59) [20]
В цикле, чьё тело выполняется много раз, и несколько тактов бывают важны. Но это уже, вероятно, к сабджу не относится.
TStream (2006-04-18 04:04:00) [16]> MBo
> может сложиться, что счетчик ссылок не единичный.
А где показывается колличество ссылок? Как посмотерть этот счётчик?
И есть ли разница между Write и WriteBuffer?
Сергей М. (2006-04-12 14:05:00) [17]
> jack128 © (12.04.06 13:51) [18]
см. [20]
Практически это ловля блох.
MBo (2006-04-12 13:59:00) [18]>потому что преобразование строки к PChar приводит к вызову функци
В принципе - да, но фактически это всего несколько тактов.
MBo (2006-04-12 13:56:00) [19]>jack128
При чтении в строку - да, uniquestring быстро сработает. А вот при записи - по-разному может быть, поскольку может сложиться, что счетчик ссылок не единичный.
jack128 (2006-04-12 13:51:00) [20]Сергей М. © (12.04.06 13:48) [17]
Соблаговоли привести аргументы в пользу такого утверждения...
потому что преобразование строки к PChar приводит к вызову функции, преобразование к Pointer - вообще не добавляет ни одной инструкции в код. Вобщем то все это можно увидеть в окне CPU