2009-09-16 81 views
13

我2007年德爾福代碼,看起來像這樣:寫入字符串到TFileStream的德爾福2010

procedure WriteString(Stream: TFileStream; var SourceBuffer: PChar; s: string); 
begin 
    StrPCopy(SourceBuffer,s); 
    Stream.Write(SourceBuffer[0], StrLen(SourceBuffer)); 
end; 

我這樣稱呼它:

var 
    SourceBuffer : PChar; 
    MyFile: TFileStream; 

.... 

SourceBuffer := StrAlloc(1024); 
MyFile := TFileStream.Create('MyFile.txt',fmCreate); 
WriteString(MyFile,SourceBuffer,'Some Text'); 
.... 

這曾在德爾福2007年,但它在Delphi 2010中給了我很多垃圾人物。我知道這是由於unicode合規性問題,但我不知道如何解決這個問題。

這是我到目前爲止已經試過:

  • 變化 SourceBuffer的數據類型(並且還通過WideString的預期參數 )到PWideChar

  • suggestions listed here的每一個

我在做什麼錯?

回答

14

您不需要單獨的緩衝區來將字符串寫入流。也許最簡單的方法來做到這一點是字符串編碼成UTF-8,像這樣:

procedure TStreamEx.writeString(const data: string); 
var 
    len: cardinal; 
    oString: UTF8String; 
begin 
    oString := UTF8String(data); 
    len := length(oString); 
    self.WriteBuffer(len, 4); 
    if len > 0 then 
     self.WriteBuffer(oString[1], len); 
end; 

function TStreamEx.readString: string; 
var 
    len: integer; 
    iString: UTF8String; 
begin 
    self.readBuffer(len, 4); 
    if len > 0 then 
    begin 
     setLength(iString, len); 
     self.ReadBuffer(iString[1], len); 
     result := string(iString); 
    end; 
end; 

我已經聲明TStreamEx作爲一個階級的幫手T流,但它不應該太困難重寫這些作爲獨奏程序和功能就像你的例子。

+1

我刪除了後,這個工作對我來說 「self.WriteBuffer(LEN,4);」 - 這是寫一些亂碼字符到輸出文件。 – JosephStyons 2009-09-16 18:33:38

+4

這些「亂碼字符」是字符串的長度,所以閱讀功能知道要讀回多少。如果你需要這是純文本,你需要一些其他方式告訴readString停止。 – 2009-09-16 18:44:19

+0

我正在將此文件寫入另一個應用程序來讀取它,所以我不能重新讀取它。 – JosephStyons 2009-09-16 18:48:10

12

德爾福2010有這個很好的解決方案,這裏記載:

http://docwiki.embarcadero.com/CodeExamples/en/StreamStrRdWr_%28Delphi%29

var 
    Writer: TStreamWriter; 
... 

    { Create a new stream writer directly. } 
    Writer := TStreamWriter.Create('MyFile.txt', false, TEncoding.UTF8); 
    Writer.Write('Some Text'); 

    { Close and free the writer. } 
    Writer.Free(); 
+4

鏈接已損壞。看起來像這樣:http://docwiki.embarcadero.com/CodeExamples/en/StreamStrRdWr_%28Delphi%29 – jonjbar 2011-01-27 16:34:08

+1

約翰,感謝您對鏈接的更正。看起來像違反了網站的黃金法則 - 永遠不會破壞固定鏈接。特別是對於一個像這樣的重名網址重命名。 – 2011-02-13 19:19:19