Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Чтение и запись строки в Stream


Страницы:   1 2

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо