Форум: "Основная";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];
Вниз
Чтение строки из 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.035 c