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

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

Чтение строки из TMemorystream [D3, Win95/98]


Оля ©   (2005-03-04 10:24:00) 

Дан  объект класса Tmemorystream. Как прочитать из него строку s длиной  9 символов? Нужен самый простой вариант.


begin...end   (2005-03-04 12:29:00) [1]

> Eraser ©   (04.03.05 12:25) [14]

Я с этим и не спорил.


Eraser   (2005-03-04 12:25:00) [2]

begin...end ©

Чтобы не возбуждалось ) надо использовать Read, а не ReadBuffer.


begin...end   (2005-03-04 12:23:00) [3]

> VMcL ©   (04.03.05 12:18) [12]

Да, пожалуй, так ещё лучше. В этом случае, если что-то не так, возбудится исключение. Спасибо.


VMcL   (2005-03-04 12:18:00) [4]

P.S. к [11]

или так, если нужно, чтобы было всегда 9:
SetLength(S, 9);
MS.ReadBuffer(S[1], 9);


VMcL   (2005-03-04 12:17:00) [5]

>> begin...end ©   (04.03.05 12:08) [9]

SetLength(S, 9);
SetLength(S, MS.Read(S[1], 9));


ИМХО, так надежнее.


Eraser   (2005-03-04 12:16:00) [6]

Cosinus ©

))))
В этом коде имеется ещё масса ошибок, например, отсутствие конструктора у ms!


begin...end   (2005-03-04 12:08:00) [7]

> Eraser ©   (04.03.05 11:52) [7]

Насчёт синтаксиса - см. [8], но пример идеологически неверен. В строке ms.Read(buf, 9)производится чтение не в выделенные 9 байтов, а в указатель.

Я бы обошёлся без всяких PChar, и читал бы сразу в String:

var
 MS: TMemoryStream;
 S: string;
begin
 ...
 SetLength(S, 9);
 MS.Read(S[1], 9)
 ...
end.


Разумеется, это подойдёт только для случая, когда в MS были записаны именно символы строки, а не указатель на неё, как это часто бывает.


Cosinus   (2005-03-04 12:03:00) [8]


> Eraser ©   (04.03.05 11:52) [7]
if ms.Count >= 9 then


Э-э-э... А разве не if ms. Size>= 9 then? :)


Eraser   (2005-03-04 11:52:00) [9]

Fixed version

var
buf: PChar;
ms: TMemoryStream;
s: string;
begin
if ms.Count >= 9 then
begin
  getmem(buf, 9);
  ms.Position := 0;
  ms.Read(buf, 9);
  s := buf;
  freemem(buf);
end;
end;


Если бы вопрос задала НЕ девушка- я бы даже его до конца не дочитал ))


MBo   (2005-03-04 11:46:00) [10]

>Eraser ©   (04.03.05 11:39) [5]
ага, в невыделенную память читал...
Впрочем, пока неизвестно, как именно строка записана в MemStream, и рассуждать-то не о чем...


Eraser   (2005-03-04 11:39:00) [11]

MBo ©

Только вмудрился даже в таком ЛИХОМ примере ошибок наделать ))))


MBo   (2005-03-04 11:37:00) [12]

>Eraser ©   (04.03.05 11:28) [3]
Лихо ;))


Eraser   (2005-03-04 11:28:00) [13]

Оля ©


var
 buf: PChar;
 ms: TMemoryStream;
 s := string;
begin
 getmem(buf, 0);
 ms.Position := 0;
 ms.Read(buf, 9);
 s := buf;
 freemem(buf);
end;


Пример из головы, так  что на синтаксис не обращай внимания- главное суть.

Главная клавиша - F1


Digitman   (2005-03-04 10:57:00) [14]


> Нужен самый простой вариант


самый простой вариант - это "Дан  объект класса T StringStream"

т.е. разумней было бы изначально использовать именно TStringStream-объект ... тогда чтение из него строк превращается в приятное "путешествие" с вызовами готового метода, читающего и возвращающего очер.строку сразу и целиком


GLFox   (2005-03-04 10:28:00) [15]

function Read(var Buffer; Count: Longint): Longint;
Вот так объявлена функция в TCustomMemoryStream. F1.


Наверх

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