我使用在Parallels VM中運行的Delphi XE2和Win10。我創建該文件是這樣的:TFilestream寫入給出了意想不到的結果
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'。我想擺脫這一點。 '返回'行是在另一個過程中產生的。花在尋找答案上的時間顯示沒有解決方案,甚至是另一個例子。也許我搜索了錯誤的單詞。
Line #: -3
Sending MN050;Line #: -3
Sending DS;Line #: -3
Returned [email protected] 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 [email protected] in 183.1767
Line #: -4
Sending MN072;DS;
Returned [email protected]@@@@[email protected] in 175.8367
Line #: -5
Sending MN026;
Sending DS;
Returned [email protected]@@03539 in 175.4539
你能表現出[MCVE ]。這個代碼也很笨拙。你真的需要把自己提升到更高的層次。你應該有一個類,你可以發送字符串,並讓他們登錄。相反,你似乎有一個邪惡的UI代碼和文件處理代碼組合。 –
謝謝你。你能告訴我爲什麼我的代碼不符合最小的,完整的,可驗證的標準嗎?雖然我同意一個班會是一個改進,但我不知道如何單獨解決我的問題。 – Mike
在附註中,您應該考慮直接使用'TStreamWriter'而不是'TFileStream'。 'TStreamWriter'可以封裝'TFileStream'(甚至在內部創建一個),並且具有接受標準的'String'值作爲輸入的'WriteLine()'方法,並且可以在其輸出中將它們寫爲UTF-8。 –