Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-31843
runser
2002-09-28 16:16
2002.10.10
Создание компонента


3-31606
MsGuns
2002-09-18 16:19
2002.10.10
Как определить последняя (первая) ли текущая запись DS ?


1-31833
вапывавп
2002-09-28 14:54
2002.10.10
римское исчисление


14-32002
EAlexander
2002-09-17 10:21
2002.10.10
Нужен ExpressSpreadSheet :))


1-31835
alf_
2002-09-28 16:31
2002.10.10
инстал





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский