var
s:string; // nie ważne ansi, czy short, to akurat nie rzutuje.
f:file;
i:integer;
assign(f,'nazwa'); // assignfile(f,'nazwa');
rewrite(f,1); // przy file of char/byte/boolean samo rewrite(f);
i:=length(s);
blockwrite(f,i,sizeof(i)); // sizeof(i)=2/4 w zależności od kompilatora/trybu
blockwrite(f,s[1],i);
close(f); //closefile(f)
assign(f,'nazwa');
reset(f,1);
blockread(f,i,sizeof(i));
setlength(s,i); // dla shortstringa moze byc s[0]:=char(i);
blockread(f,s[1],i);
close(f);
Zakładając, że sizeof(i) jest niezmienne w czasie, dla tego samego kompilatora i trybu docelowego... Nie ma prostszej metody. Dla widestring'a wystarczy tylko w wywołaniech blockread/blockwrite(f,s[1],i) zmienić i na (i*2) lub (i shl 1), wynik będzie ten sam.
// Przy pierwszej odpowiedzi myslałem, że poradzisz sobie z różnicą pomiędzy dynamiczną array of sth a stringiem (indeksowanie od 0 lub od 1). Ale widać za duzo zakładałem.
// na koniec... ten nieciekawy wątek za długo sie ciągnie...
type
TLogItem = record
LogTime: string;
ID: LongInt;
name: string;
end;
TLog=array of TLogItem;
var
Tablica:TLog;
procedure save(name:string;var t:tlog);
var
f:file;
i,j:integer;
begin
assign(f,name);
rewrite(f,1);
for i:=0 to length(t)-1 do
with(t[i])do
begin
j:=length(logtime);
blockwrite(f,j,sizeof(j));
blockwrite(f,logtime[1],j);
blockwrite(f,id,sizeof(id));
j:=length(name);
blockwrite(f,j,sizeof(j));
blockwrite(f,name[1],j);
end;
close(f);
end;
procedure load(name:string;var t:tlog);
var
f:file;
i,j:integer;
begin
assign(f,name);
reset(f,1);
i:=0;
while(not eof(f))do
begin
inc(i);
setlength(t,i);
with(t[i-1])do
begin
blockread(f,j,sizeof(j));
setlength(logtime,j);
blockread(f,logtime[1],j);
blockread(f,id,sizeof(id));
blockread(f,j,sizeof(j));
setlength(name,j);
blockread(f,name[1],j);
end;
end;
close(f);
end;
// sorki pq.. nie przeczytałem wcześniej ;p