使用delphi从.log文件读取时,将“ÿþI”作为输出数据

时间:2011-10-06 11:59:12

标签: delphi delphi-7 delphi-2007

我正在尝试从.log文件中读取数据并处理其内容。日志文件由另一个应用程序创建。当我在Delphi中使用readln命令并在备忘录中显示文件的内容时,我只从一个包含超过6000行数据的文件中获取一行数据(ÿþI)。

    procedure TForm1.Button1Click(Sender: TObject);
    Var
        F : TextFile;
        s : string;
    begin
        AssignFile(F, 'data.log');
        Reset(F);

        while not Eof(F) do
        begin
            Readln(F, s);
            Memo1.Lines.Add(s);
        end;
    end;

有谁知道问题可能是什么?

3 个答案:

答案 0 :(得分:4)

你正在处理一个UTF-16文件(由前两个字符证明),并且Delphi 2007没有为此做好准备,所以它停止读取前0美元字节,因为Readln认为线在那里结束。

您需要使用不同的方法来读取文件,并且您必须读入WideString(并可能将其转换为字符串)。由于Delphi 2007不具备适当的Unicode功能,我认为你还必须进行自己的行分割,但我没有这个,所以我不完全确定。

答案 1 :(得分:3)

正如Michael所说,您正在处理UTF-16编码文件,因此您必须手动加载和解码它。有各种基于WideString的{​​{1}}类似的类在线浮动,或者Borland在TStringList单元中有自己的实现,尝试使用其中一个而不是Pascal文件I / O,例如:

WideStrings

或者:

procedure TForm1.Button1Click(Sender: TObject);
var
  SL : TWideStringList;
  I: Integer;
  s : string;
begin
  SL := TWideStringList.Create;
  try
    SL.LoadFromFile('data.log');
    Memo1.Lines.BeginUpdate;
    try
      for I := 0 to SL.Count-1 do
        Memo1.Lines.Add(SL[I]);
    finally
      Memo1.Lines.EndUpdate;
    end;
  finally
    SL.Free;
  end;
end; 

或者,安装TNTWare或TMS的副本,这两个副本都具有启用Unicode的组件。然后你应该能够直接{。1}} .log文件直接进入你选择使用的更多Unicode Memo组件。

答案 2 :(得分:0)

正如我对Remy的回答所述,在WideStrings中声明了一个TWideStrings / TWideStringList:

uses WidesStrings;
//...
var
  Ws: TWideStrings;
  s: string;
  i: Integer;
begin
  Ws := TWideStringList.Create;
  try
    ws.LoadFromFile('C:\temp\UniTest.txt');
    for i := 0 to ws.Count - 1 do
    begin
      s := ws[i];
      Memo1.Lines.Add(s);
    end;
  finally
    ws.Free;
  end;
end;

但请注意,这不是TStrings后代,因此无法直接将其分配给像TMemo.Lines这样的TStrings属性,您必须逐个添加它们。

它似乎也无法处理BOM(您的ÿþ)或大端编码