2013-02-11 65 views
6

我已經在這裏關於字符串寫入到內存流並保存到文件,並在對內存流字符串寫入到內存流

我不知道我做錯了這裏讀串回來讀了很多的討論,但無論是我的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; 
+1

你爲什麼不嘗試'TStringStream'? – TLama 2013-02-11 15:28:13

+1

或者給TStringList.SaveToFile/LoadFromFile一個試試嗎? – iamjoosy 2013-02-11 15:35:26

+0

是的,考慮到'TStrings'具有'SaveToStream'和'LoadFromStream',所有的代碼似乎毫無意義。如果這不適合真正的應用程序,那麼讀者/作家班將完成這項工作。 – 2013-02-11 15:44:04

回答

17

當您使用

Stream.Write(Str[1], StrLen); 

你寫第一StrLen字節流中。但(unicode)字符串數據實際上是StrLen * SizeOf(Char)字節(您必須考慮char類型的大小)。所以下面應該工作:

Stream.Write(Str[1], StrLen * SizeOf(Str[1])); 

從流中讀回數據時相同。

+15

'ByteLength(Str)'存在這個 – 2013-02-11 15:42:32

+0

這將工作!謝謝! – JakeSays 2013-02-11 16:13:23