Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
TMemoryStream и string переменная
|
|||
|---|---|---|---|
|
#18+
в поток записываю информацию : первые 8 байт - размер файла, следующие 4 байта - имя файла Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. при обратном процессе (чтении потока) хочу узнать имя и размер файла, сам файл извлечь на диск Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. переменная filesize считывается замечательно - все правильно а вот FileName inaccessible value как лечить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2003, 10:43 |
|
||
|
TMemoryStream и string переменная
|
|||
|---|---|---|---|
|
#18+
В Delphi начиная со второй версии по умолчанию все переменные string на самом деле являются указателями, а не переменными. Borland разработала специальный механизм для работы с "длинными строками", которые могут иметь длинну до 2 Gb (если память повзолит). Этот механизм отличается от стандартного Pascal, где строка имеет длину всего 255 символов. В Pascal срока всегда объявлялась с указанием максимального размера строки, например string[60]. При этом в памяти для такой переменной выделяется 61 байт, а сама строка рассматривается как массив типа char. При этом элемент 0 хранит реальную длину строки, которая в данном примере не может быть больше 60 символов. В новом механизме работы с длинными строками переменная типа string по умоляанию будет считаться указателем на соответсвующую область памяти, где уже и хранятс сами символы строки. Строка завершается символом 0, точно так же, как в C. Ошибка, которая возникает у вас, вызвана тем, что вы сохраняете не собственно строку символов, а указатель на эту строку. Но при разных запусках программы эти указатели будут разными. Да и что там в этой области памяти будет хранится тоже неизвестно. То есть, нужно либо объявить вашу переменную по другому, например filename :string[200]; тогда Delphi использует старый механизм работы со строками. Тогда текст поменяется на ... OutputStream.Write( FileName, 201); ... OutputStream.Read( FileName, 201) ; ... Да, строку OutputStream.Position := 8; можно убрать, поскольку после считывания 8 байт указатель и так будет там, где необходимо. :) Если же хотите работать с длинными строками, то нужно делать так же, как бы вы делали в С. Выглядеть будет примерно так: var OutputStream :TMemoryStream ; filesize:int64 ; filename :string ; StrSize:int; ... OutputStream.Write( FileSize,SizeOf(FileSize)) ; StrSize:=Length(FileName); OutputStream.Write(StrSize,SizeOf(StrSize)) ; //сохраняем размер строки OutputStream.Write( FileName^,StrSize) ; //сохраняем символы строки {запись самого файла в конец потока} ... считывание var OutputStream :TMemoryStream ; filesize:int64 ; filename :string ; StrSize:int; ... OutputStream.Position := 0 ; OutputStream.Read( FileSize,SizeOf(FileSize)) ; OutputStream.Read( StrSize,SizeOf(StrSize)) ; //считываем длину строки SetLength(FileName,StrSize); //данная функция выделяет под строку необходимое количество байт в памяти OutputStream.Read( FileName^,StrSize) ; //считываем символы строки ... Примерно так. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2003, 12:26 |
|
||
|
TMemoryStream и string переменная
|
|||
|---|---|---|---|
|
#18+
все верно, только в строке OutputStream.Write( FileName^,StrSize) ; //сохраняем символы строки , впрочем как и чтенеие OutputStream.Read( FileName^,StrSize) надо вместо FileName^ использовать pointer(FileName)^ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2003, 12:49 |
|
||
|
|

start [/forum/topic.php?fid=58&tid=2115375]: |
0ms |
get settings: |
7ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
50ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
| others: | 217ms |
| total: | 364ms |

| 0 / 0 |
