Вниз
Скачать: CL | DM;

Чтение строки из TMemorystream   Найти похожие ветки 

← →
Оля ©   (2005-03-04 10:24) [0]

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


← →
GLFox ©   (2005-03-04 10:28) [1]

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


← →
Digitman ©   (2005-03-04 10:57) [2]


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


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

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


← →
Eraser ©   (2005-03-04 11:28) [3]

Оля ©


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


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

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


← →
MBo ©   (2005-03-04 11:37) [4]

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


← →
Eraser ©   (2005-03-04 11:39) [5]

MBo ©

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


← →
MBo ©   (2005-03-04 11:46) [6]

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


← →
Eraser ©   (2005-03-04 11:52) [7]

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;


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


← →
Cosinus ©   (2005-03-04 12:03) [8]


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


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


← →
begin...end ©   (2005-03-04 12:08) [9]

> 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 были записаны именно символы строки, а не указатель на неё, как это часто бывает.


← →
Eraser ©   (2005-03-04 12:16) [10]

Cosinus ©

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


← →
VMcL ©   (2005-03-04 12:17) [11]

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

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


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


← →
VMcL ©   (2005-03-04 12:18) [12]

P.S. к [11]

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


← →
begin...end ©   (2005-03-04 12:23) [13]

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

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


← →
Eraser ©   (2005-03-04 12:25) [14]

begin...end ©

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


← →
begin...end ©   (2005-03-04 12:29) [15]

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

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



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.026 c
14-1109748040
Павел
2005-03-02 10:20
2005.03.20
SATA RAID 0 Нужен ли он?


4-1107435773
dnv-Nik
2005-02-03 16:02
2005.03.20
Работа через USB


1-1109269163
Noctus
2005-02-24 21:19
2005.03.20
стрелка как в Microsoft Visio


14-1109258201
kesha
2005-02-24 18:16
2005.03.20
"Login" по русски


1-1110295911
xmrz
2005-03-08 18:31
2005.03.20
Delphi 2005 & ASP .NET




   Наверх