Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.20;
Скачать: 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 вся ветка

Текущий архив: 2005.03.20;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.056 c
4-1108026880
Mac
2005-02-10 12:14
2005.03.20
Есть хендл окна. Как с этого окна (грида) скопировать даные ?


14-1109866422
kaif
2005-03-03 19:13
2005.03.20
Вопрос[2]. О власти


11-1080292006
XmPL
2004-03-26 12:06
2005.03.20
Установка KOL/MCK с нуля


3-1108708207
Ольга
2005-02-18 09:30
2005.03.20
UPDATE с углубленным сравнением


6-1105978255
vers
2005-01-17 19:10
2005.03.20
Файрвол