TFilestream写入会产生意外结果

时间:2016-04-13 19:12:21

标签: delphi

我正在使用在Parallels VM中运行的Delphi XE2和Win10。我创建这样的文件:

logfile := TFilestream.Create(WRITE_PATH + 'Log.txt', fmCreate);

这是写:

procedure TfrmMain.Logit(const sToLog: string);
var
len: cardinal;
ss, sx: UTF8String;
str: string;
begin
if mnuMain.Items[1].Items[2].checked then
begin
    str := 'Line #: ' + intToStr(GridLine) + #13#10;
    ss := UTF8String(str);
    len := length(ss);
    logfile.WriteBuffer(ss[1],len);
    ss := '';    
    str := '';
    len := 0;
    sx := UTF8String(sToLog);
    len := length(sx);
    logfile.WriteBuffer(sx[1], len);
  end;
end;

结果。请注意'发送'行中额外的'Line#:-3'。我想摆脱它。 '返回'行在另一个proc中生成。搜索答案所花费的时间显示没有解决方案,甚至是另一个例子。也许我搜错了。

Line #: -3
Sending MN050;Line #: -3
Sending DS;Line #: -3
Returned DSANT=ATV@ in 168.5584

更改了代码:

procedure TfrmMain.Logit(sToLog: string);
var
  len: cardinal;
  ss, sx: UTF8String;
  str: string;
begin
  str := mnuMain.Items[1].Items[2].Caption;
  if mnuMain.Items[1].Items[2].checked then
  begin
    if flag then
    begin
      str := 'Line #: ' + intToStr(GridLine) + #13#10;
      ss := UTF8String(str);
      len := length(ss);
      logfile.WriteBuffer(ss[1],len);
    end;
    flag := false;
    ss := UTF8String('');
    sx := UTF8String(sToLog) + #13#10;
    len := length(sx);
    logfile.WriteBuffer(sx[1], len);
  end;
end;

结果:

Line #: -3
Sending MN050;
Sending DS;
Sending DS;Returned DSANT=ATV@ in 183.1767

Line #: -4
Sending MN072;DS;
Returned DS@@@@@ON@ in 175.8367

Line #: -5
Sending MN026;
Sending DS;
Returned DS@@@03539 in 175.4539

2 个答案:

答案 0 :(得分:4)

它使您错误地解释了日志的内容及其编写方式。 对程序的第一次调用导致

Line #: -3<CRLF>
Sending MN050;

(我添加了<CRLF>来表示新行字符)

注意,第二行之后没有<CRLF>。 因此,下一个呼叫将连接到第一个呼叫的第二行

Line #: -3<CRLF>
Sending MN050;Line #: -3<CRLF>
Sending DS;

第三个电话再次连接到上一个

的结尾
Line #: -3<CRLF>
Sending MN050;Line #: -3<CRLF>
Sending DS;Line #: -3<CRLF>
Returned DSANT=ATV@ in 168.5584

也许你打算这样做:

Line #: -3 Sending MN050;<CRLF>
Line #: -3 Sending DS;<CRLF>
Line #: -3 Returned DSANT=ATV@ in 168.5584<CRLF>

您可以通过移动+ #13#10来实现 从

str := 'Line #: ' + intToStr(GridLine) + #13#10;

sx := UTF8String(sToLog + #13#10);

答案 1 :(得分:3)

您不能在#13#10字符串后添加sToLog CRLF序列,因此下一个Line #:会转到同一行。 可能的纠正

str := sToLog + #13#10;
len := 0;
sx := UTF8String(str);

但您最好使用GridLine和sToLog参数将此代码重写为独立函数或方法