Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

BlockWrite <-> BlockRead


KIR ©   (2002-10-01 12:00:00) 

Народ, подскажите как правильно реализовывается сабж. Мне требуется записать, а потом считать строку. Я делаю так

procedure Write;
var
IntBuf: Integer;
S: String;
Fl: File;
begin
S := "MyString";
IntBuf := Length(S);
BlockWrite(Fl,IntBuf,SizeOf(IntBuf));
BlockWrite(Fl,S,IntBuf);
end;

procedure Read;
var
IntBuf: Integer;
S: String;
Fl: File;
begin
BlockRead(Fl,IntBuf,SizeOf(IntBuf));
SetLength(S,IntBuf);
BlockRead(Fl,S,SizeOf(S));
end;

т ничего у меня не выходит...


KIR   (2002-10-01 12:49:00) [1]

>Dititman спасибо за разъяснения по поводу String"a. Я действительно предполагал иначе.


han_malign   (2002-10-01 12:46:00) [2]

String суть указатель(тот же самый PChar, только по адресу pointer(DWORD(String)-4)лежит DWORD - длинна строки), а поскольку параметр var Buffer;(нетипизированный)то в стек функции попадает указатель(поскольку var) не на данные, а на указатель на данные(и ты еще залезаешь в чужую кучу).
З.Ы. PChar не обязательно - достаточно S[1](<==> PChar(S)^)


Digitman   (2002-10-01 12:38:00) [3]

>KIR

ну, можно и так.
суть от этого не меняется


Digitman   (2002-10-01 12:37:00) [4]

>KIR

string имеет иную структуру в памяти, нежели ты наивно предполагал. string есть просто 4-байтная ссылка на упр.структуру строки, а не сами строковые данные.




KIR   (2002-10-01 12:36:00) [5]

>Digitman Да, кстати в твоем алгоритме я сделал так:

procedure Read;
var
IntBuf: Integer;
S: String;
Fl: File;
begin
BlockRead(Fl,IntBuf,SizeOf(IntBuf));
SetLength(S,IntBuf);
// BlockRead(Fl,@S[1],IntBuf);
BlockRead(Fl,S[1],IntBuf);
end;



KIR   (2002-10-01 12:34:00) [6]

>Digitman
Спасибо. Все заработало, но в чем принципиальное отличие? Почему при использовании PChar все работает, а когда делаешь по сути то же самое со String"ом не хочет?


Digitman   (2002-10-01 12:33:00) [7]

>KIR

Еще бы не работало !)
Ну так - что ? Выводы-то какие у тебя напрашиваются ?)


KIR   (2002-10-01 12:18:00) [8]

Вот с intrger и Extended все работает:

...
BlockWrite(Fl,Int,SizeOf(Int));
BlockWrite(Fl,Ext,SizeOf(Ext));
...

...
BlockRead(Fl,Int,SizeOf(Int));
BlockRead(Fl,Ext,SizeOf(Ext));
...


KIR   (2002-10-01 12:15:00) [9]

Про файл все ясно. Это вообще упрощенный алгоритм я его написал для примера, чтоб не народ не нагружать. Файл-то я, естественно открываю и закрываю. Вообще в этом файле хронится куча разной инфы различных типов, вот теперь понадобилось туда строки загнать. Я вообще-то уже сделал так что они пишутся туда через MyArr = array[1..255] of Char, но это кривовато, т.к. будь строка 1 символ или 255 все пишется все...


Digitman   (2002-10-01 12:15:00) [10]

procedure Write;
var
IntBuf: Integer;
S: PChar;
Fl: File;
begin
S := "MyString";
IntBuf := strlen(S);
BlockWrite(Fl,IntBuf,SizeOf(IntBuf));
BlockWrite(Fl,S^,IntBuf);
end;

procedure Read;
var
IntBuf: Integer;
S: String;
Fl: File;
begin
BlockRead(Fl,IntBuf,SizeOf(IntBuf));
SetLength(S,IntBuf);
BlockRead(Fl,@S[1],IntBuf);
end;


han_malign   (2002-10-01 12:13:00) [11]

кстати в BlockRead и BlockWrite указывается размер в Record-ах, а по умолчанию, если не говорить F1:file of byte, размер record-а - 256 байт. И файл действительно нужно открывать (AssignFile,Rewrite,Reset)и на всякий случай перед чтением seek-ать на начало.


qube   (2002-10-01 12:01:00) [12]

А файл открывать кто будет?


Наверх

Титульная страница Поиск, карта сайта Написать письмо