Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.10;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
14-32006
qwerty123x
2002-09-16 12:38
2002.10.10
Сколько стоит заказать сантехника? (я имею в виду услуги киллера)


3-31613
Dmitrey
2002-09-19 09:09
2002.10.10
Проблема переноса с ADO2.5 на ADO2.7


1-31773
MegAnthropos
2002-09-27 16:41
2002.10.10
ExcelApplication и прочиe TOLEServer


7-32029
Ffaster
2002-07-31 01:29
2002.10.10
Как из своей проги запустить остановить Сервер удалённого доступа


3-31651
oss
2002-09-18 14:38
2002.10.10
ADO, StoreProc