Главная страница
    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.48 MB
Время: 0.037 c
3-1108641488
LEONardo
2005-02-17 14:58
2005.03.20
Обработка двух групповых функций


4-1107707452
Локли
2005-02-06 19:30
2005.03.20
Уровень звука


1-1110281018
zioza
2005-03-08 14:23
2005.03.20
Как сделать что бы при запуске особово файла запускалась моя прог


1-1109837639
Никола
2005-03-03 11:13
2005.03.20
Если кто работал с мобилками.....


4-1106976743
kvit
2005-01-29 08:32
2005.03.20
Как заставить модем...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский