我已經在這裏關於字符串寫入到內存流並保存到文件,並在對內存流字符串寫入到內存流
我不知道我做錯了這裏讀串回來讀了很多的討論,但無論是我的SaveData或我的LoadData是錯誤的。在調用SaveData之前,我可以檢查標題的值,並且它符合我的預期。但是,當我調用LoadData並檢查Title的值時,它是垃圾。誰能告訴我什麼,我做錯了,請
procedure SaveData(FileName: TFileName);
var
MemStr: TMemoryStream;
Title: String;
begin
MemStr:= TMemoryStream.Create;
try
MemStr.Seek(0, soFromBeginning);
WriteStreamStr(MemStr, TItle);
MemStr.SaveToFile(FileName);
finally
MemStr.Free;
end;
end;
procedure LoadData(FileName: TFileName);
var
MemStr: TMemoryStream;
Title: String;
begin
MemStr:= TMemoryStream.Create;
try
MemStr.LoadFromFile(FileName);
MemStr.Seek(0, soFromBeginning);
Title := ReadStreamStr(MemStr);
finally
MemStr.Free;
end;
end;
procedure WriteStreamInt(Stream : TStream; Num : integer);
{writes an integer to the stream}
begin
Stream.WriteBuffer(Num, SizeOf(Integer));
end;
procedure WriteStreamStr(Stream : TStream; Str : string);
{writes a string to the stream}
var
StrLen : integer;
begin
{get length of string}
StrLen := Length(Str);
{write length of string}
WriteStreamInt(Stream, StrLen);
if StrLen > 0 then
{write characters}
Stream.Write(Str[1], StrLen);
end;
function ReadStreamInt(Stream : TStream) : integer;
{returns an integer from stream}
begin
Stream.ReadBuffer(Result, SizeOf(Integer));
end;
function ReadStreamStr(Stream : TStream) : string;
{returns a string from the stream}
var
LenStr : integer;
begin
Result := '';
{get length of string}
LenStr := ReadStreamInt(Stream);
{set string to get memory}
SetLength(Result, LenStr);
{read characters}
Stream.Read(Result[1], LenStr);
end;
你爲什麼不嘗試'TStringStream'? – TLama 2013-02-11 15:28:13
或者給TStringList.SaveToFile/LoadFromFile一個試試嗎? – iamjoosy 2013-02-11 15:35:26
是的,考慮到'TStrings'具有'SaveToStream'和'LoadFromStream',所有的代碼似乎毫無意義。如果這不適合真正的應用程序,那麼讀者/作家班將完成這項工作。 – 2013-02-11 15:44:04