![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чтение строки из 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.