0

テキストの一部と発生した時刻と日付を含む各イベントの行を保存しようとしています。

問題は:

  1. 時刻は中国語フォントで表示されます
  2. 同じ行を何度も置き換えます

コードは次のとおりです。

    uses sysUtils, classes;

function log: Boolean;
var
  fs: TFileStream;
  i : String;
  time : TDateTime;

begin
  i := 'Boss is dead!';
  time := now;
  try
    fs := TFileStream.Create('log.txt', fmCreate or fmOpenWrite);
    fs.Write(PChar(i +TimeToStr(time))^, Length(i +TimeToStr(time)));
    fs.write(i, sizeof(i));   
  finally
    fs.Free; 
  end;

end;

ありがとうございました。

4

3 に答える 3

2

通常、ラテン語のテキストを期待しているのに中国語のテキストが表示される場合は、ANSI テキストを UTF-16 であるかのように解釈していることを意味します。このことから、UTF-16 テキストを書き出すつもりであると推測されますが、実際には ANSI テキストを書き出しています。これは、Unicode 以前の Delphi を使用していることを意味します。

ファイルを上書きし続ける理由に関しては、それはfmCreate. 本当にやりたいことは、既存のファイルを書き込みモードで開くか、ファイルが存在しない場合は新しいファイルを作成することです。Win32 API 関数はOPEN_ALWAYS作成処理でそれをサポートします。しかし、それは では利用できませんTFileStream.Create。したがって、直接使用THandleStreamして呼び出す必要がありますCreateFile。新しいバージョンの Delphi では、機能TFile.Openが公開されていることに注意してくださいOPEN_ALWAYS。しかし、あなたが使用している Delphi は古すぎるというのが私の推論です。

THandleStreamを使用して正しく呼び出すことができると仮定すると、CreateFileUTF-16 テキストを書き出すだけで済みます。最も簡単な方法は、を使用することWideStringです。次のようなコードを記述できます。

var
  ws: WideString;
....
Stream.Seek(0, soFromEnd);
ws := TimeToStr(Now) + sLineBreak;
Stream.WriteBuffer(PWideChar(ws)^, SizeOf(WideChar)*Length(ws));

一方、おそらく中国人はここから来ています:

fs.write(i, sizeof(i));

このコードは、単純にファイルへのポインターを書き込みます。あなたは確かにそれをしたくないので、その行を削除する必要があります. 完全を期すために、Unicode Delphi を使用している場合は、非常に似た方法でテキストを記述します。このような:

var
  s: string;
....
Stream.Seek(0, soFromEnd);
s := TimeToStr(Now) + sLineBreak;
Stream.WriteBuffer(PWideChar(s)^, SizeOf(WideChar)*Length(s));

ストリームへの追加に戻ると、次のように実行されます。

var
  hFile: THandle;
....
hFile := CreateFile(
  PChar(LogFileName),
  GENERIC_WRITE,
  FILE_SHARE_READ,
  nil,
  OPEN_ALWAYS,
  FILE_ATTRIBUTE_NORMAL,
  0
);
Win32Check(hFile<>INVALID_HANDLE_VALUE);
Try
  Stream := THandleStream.Create(hFile);
  Try
    .... code to write to the stream goes here
  Finally
    Stream.Free;
  End;
Finally
  CloseHandle(hFile);
End;

最後に、この回答では、あなたの環境について多くの推測をしなければなりませんでした. 今後は、使用する Delphi のバージョンを常に含めてください。そして常にあなたの目標の明確な声明を含めてください。

于 2015-04-14T21:22:14.967 に答える
0

これはどう:

uses SysUtils;

var s: AnsiString;

s := FormatDateTime('yyyy-mm-dd hh:nn:ss', now);
fs.Write(s[1], Length(s));
于 2015-04-15T00:32:04.510 に答える