Форум: "Основная";
Текущий архив: 2002.10.10;
Скачать: [xml.tar.bz2];
ВнизBlockWrite <-> BlockRead Найти похожие ветки
← →
KIR (2002-10-01 12:00) [0]Народ, подскажите как правильно реализовывается сабж. Мне требуется записать, а потом считать строку. Я делаю так
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;
т ничего у меня не выходит...
← →
qube (2002-10-01 12:01) [1]А файл открывать кто будет?
← →
han_malign (2002-10-01 12:13) [2]кстати в BlockRead и BlockWrite указывается размер в Record-ах, а по умолчанию, если не говорить F1:file of byte, размер record-а - 256 байт. И файл действительно нужно открывать (AssignFile,Rewrite,Reset)и на всякий случай перед чтением seek-ать на начало.
← →
KIR (2002-10-01 12:15) [3]Про файл все ясно. Это вообще упрощенный алгоритм я его написал для примера, чтоб не народ не нагружать. Файл-то я, естественно открываю и закрываю. Вообще в этом файле хронится куча разной инфы различных типов, вот теперь понадобилось туда строки загнать. Я вообще-то уже сделал так что они пишутся туда через MyArr = array[1..255] of Char, но это кривовато, т.к. будь строка 1 символ или 255 все пишется все...
← →
Digitman (2002-10-01 12:15) [4]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;
← →
KIR (2002-10-01 12:18) [5]Вот с intrger и Extended все работает:
...
BlockWrite(Fl,Int,SizeOf(Int));
BlockWrite(Fl,Ext,SizeOf(Ext));
...
...
BlockRead(Fl,Int,SizeOf(Int));
BlockRead(Fl,Ext,SizeOf(Ext));
...
← →
Digitman (2002-10-01 12:33) [6]>KIR
Еще бы не работало !)
Ну так - что ? Выводы-то какие у тебя напрашиваются ?)
← →
KIR (2002-10-01 12:34) [7]>Digitman
Спасибо. Все заработало, но в чем принципиальное отличие? Почему при использовании PChar все работает, а когда делаешь по сути то же самое со String"ом не хочет?
← →
KIR (2002-10-01 12:36) [8]>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;
← →
Digitman (2002-10-01 12:37) [9]>KIR
string имеет иную структуру в памяти, нежели ты наивно предполагал. string есть просто 4-байтная ссылка на упр.структуру строки, а не сами строковые данные.
← →
Digitman (2002-10-01 12:38) [10]>KIR
ну, можно и так.
суть от этого не меняется
← →
han_malign (2002-10-01 12:46) [11]String суть указатель(тот же самый PChar, только по адресу pointer(DWORD(String)-4)лежит DWORD - длинна строки), а поскольку параметр var Buffer;(нетипизированный)то в стек функции попадает указатель(поскольку var) не на данные, а на указатель на данные(и ты еще залезаешь в чужую кучу).
З.Ы. PChar не обязательно - достаточно S[1](<==> PChar(S)^)
← →
KIR (2002-10-01 12:49) [12]>Dititman спасибо за разъяснения по поводу String"a. Я действительно предполагал иначе.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.10.10;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c