![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]А файл открывать кто будет?