2009-09-16 9 views
13

を書く:それは私はこのようになりますデルファイ2007コード持っているデルファイ2010年にTFileStreamに文字列

var 
    SourceBuffer : PChar; 
    MyFile: TFileStream; 

.... 

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

これは、Delphi 2007年に働いたが、私はこのようにそれを呼び出す

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

をDelphi 2010で多くの迷惑メールが発生しています。これは、Unicodeのコンプライアンスの問題が原因であることがわかりましたが、この問題に対処する方法がわかりません。ここで

は、私がこれまで試したものです:

  • 変更 SourceBufferのデータ型は(ともWideStringに期待されるパラメータ )はPWideChar型する

  • suggestions listed hereの一人一人

私は間違っていますか?

答えて

14

文字列をストリームに書き込むために別のバッファは必要ありません。

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; 

私はTStreamにのクラスヘルパーとしてTStreamExを宣言したが、これらを書き換えるにはあまりにも難しいことではありません:おそらくそれを行うための最も簡単な方法はこれのように、UTF8に文字列を符号化することですあなたの例のようなソロの手順と機能。デルファイ2010

+1

"self.WriteBuffer(LENを、4);" - それは出力ファイルに不器用な文字を書いていました。 – JosephStyons

+4

"ぎこちない文字"は文字列の長さです。したがって、読み込み関数は読み込み量を知っています。これをプレーンテキストにする必要がある場合は、readStringにどこで停止するかを指示する必要があります。 –

+0

私はこのファイルを別のアプリケーションで読み込んで読み込んでいるので、読み込むことは重要ではありません。 – JosephStyons

12

がここに文書化され、このための良い解決策、持っている:私は削除した後、これが私のために働いた

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

+1

ジョン、リンクを修正してくれてありがとう。ウェブサイトのゴールデンルールに違反しているように見えます。決してパーマリンクを破ることはありません。特にこのような簡単なURLの名前変更の場合 –

関連する問題