Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
4-1107765583
REA
2005-02-07 11:39
2005.03.20
TreeView checkboxes


8-1101746085
PitBult
2004-11-29 19:34
2005.03.20
Как записать в AVI всё что происходит на экране?


1-1110273056
ser35
2005-03-08 12:10
2005.03.20
отображение даты


11-1093082309
Алексей
2004-08-21 13:58
2005.03.20
Как в mainmenu установить горячую клавишу "Esc"?


1-1110384707
1010111000110101110
2005-03-09 19:11
2005.03.20
Delphi 8 for .NET и обычный Windows - нельзя?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский