2013-02-11 2 views
6

을 TMemoryStream이하는 나는 여기에 TMemoryStream이에 쓰는 문자열에 관한하고 파일에 저장하고 내가 잘못 여기에 무엇을했는지 잘 모릅니다 쓰기 문자열

TMemoryStream이

에 다시 문자열을 읽고 토론을 많이 읽을 수 있지만 한 중 내를 SaveData 또는 내 LoadData가 잘못되었습니다. SaveData를 호출하기 전에 Title의 값을 확인할 수 있으며 예상 한 값을 유지합니다. 그러나 LoadData를 호출하고 Title 값을 확인하면 쓰레기가됩니다. 당신이 스트림에 처음 StrLen 바이트를 쓰고있어

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

을 사용하면 사람이 내가 잘못

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

+1

TStringList.SaveToFile/LoadFromFile을 시도해 보시겠습니까? – iamjoosy

+0

예,'TStrings'에는'SaveToStream'과'LoadFromStream'이 있습니다. 모든 코드는 무의미 해 보입니다. 그리고 실제 응용 프로그램에 적합하지 않은 경우 리더/작가 클래스가 작업을 수행합니다. –

답변

17

하십시오 무엇을했는지 말해 줄 수. 그러나 (유니 코드) 문자열 데이터는 실제로 StrLen * SizeOf(Char) 바이트입니다 (char 형식의 크기를 고려해야합니다). 따라서 다음 작업을 수행해야합니다.

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

스트림에서 데이터를 다시 읽을 때와 동일합니다.

+15

ByteLength (Str)'이 존재합니다. –

+0

그게 효과가 있습니다! 고맙습니다! – JakeSays