Delphi 2010 WriteLn to Text File切断大约55个字符

时间:2011-01-20 22:53:54

标签: delphi delphi-2010

鉴于这种混乱(多年前设计用于将某些数据写入csv“field1”,“field2”),输出文件已开始停止大约55个字符。在showmessage()调用或放置在本地String变量中也是如此。转换为TStringList以清除代码甚至以相同的方式失败。在代码停止时在IDE中将此检查为本地字符串变量将按计划显示整个构建的字符串。 ShowMessage()甚至会在最后添加尾随省略号....

我最终以“LD”,“BC63781S”,“JACKSON”,“MS”,“DENVER”,“CO”,“1186”,“0”...在showmessage和“LD”,“BC63781S磁盘文件中的“,”JACKSON“,”MS“,”DENVER“,”CO“,”1186“,”0“。

更好的可读性 https://gist.github.com/788839

Writeln(F,
  '"'+ ACtion
  + '","' + Ini.ReadString('IP_ITS','BAccount','TEST')
  + '","' + FieldByName('PICKCITY').AsString
  + '","' + FieldByName('PICKST').AsString
  + '","' + FieldByName('DROPCITY').AsString
  + '","' + FieldByName('DROPST').AsString
  + '","' + FieldByName('TOT_MILES').AsString
  + '","' + FloatToStr(AWeight)
  + '","' + FieldByName('LENGTH').AsString
  + '","' + FloatToStr(AStops)
  + '","' + ''{grosspay}
  + '","' + FieldByName('PICK_DATE').AsString
  + '","' + FieldByName('PICK_TIME').AsString
  + '","' + FieldByName('DROP_DATE').AsString
  + '","' + FieldByName('DROP_TIME').AsString
  + '","' + AEquip
  + '","","' + ALTL
  + '"' + ',"","' + '","1","'
  + Ini.ReadString('IP_ITS','BComp','BAccount')
  + FieldByName('PRO_NO').AsString
  + '","","","","",""'
  )

4 个答案:

答案 0 :(得分:5)

两个修复可能性:

1)而不是每个字符串之间的+号,而是使用a。它将让Writeln()进行文本连接。

          Writeln(F, '"',ACtion,'","', Ini.ReadString('IP_ITS','BAccount','TEST'),'","',
            FieldByName('PICKCITY').AsString,'","',FieldByName('PICKST').AsString,'","',
            FieldByName('DROPCITY').AsString,'","',FieldByName('DROPST').AsString,'","',
            FieldByName('TOT_MILES').AsString,'","',FloatToStr(AWeight),","',
            FieldByName('LENGTH').AsString,'","',FloatToStr(AStops),
            '","',''{grosspay},'","',FieldByName('PICK_DATE').AsString,
            '","',FieldByName('PICK_TIME').AsString,'","',FieldByName('DROP_DATE').AsString,
            '","',FieldByName('DROP_TIME').AsString,'","',AEquip,
            '","","',ALTL,'"' , ',"","',
            '","1","',Ini.ReadString('IP_ITS','BComp','BAccount'),FieldByName('PRO_NO').AsString,
            '","","","","",""');

2)使用Format()然后打开参数数组 - 这是我的首选方式,因为它也更容易修复/维护

  Writeln(F, format('"%s","%s","%s","%s","%s","%s","%s",  ....
    [ACtion,Ini.ReadString('IP_ITS','BAccount','TEST'),FieldByName('PICKCITY').AsString, ..... ]));

在所有情况下,请确保您已设置一定大小的写入缓冲区,并使用{$ I - }:

procedure TClassData.SaveToFile(const FileName: TFileName);
var F: system.Text;
    buf: array[word] of byte;
begin
  {$I-}
  assign(F,FileName);
  system.SetTextBuf(F,buf);
  rewrite(F);
  if ioresult=0 then
  begin
    writeln(F,...
    ...

答案 1 :(得分:1)

由于原因,我可能永远不会理解观察字符串数据的行为迫使它截断。 ShowMessage()并没有停止它将文件写得很好。

放一个ShowMessage()或停止而不是骰子。

Quantum Delphi?

也许一个Flush调用会有助于ShowMessage()为什么会切断55个字符?

答案 2 :(得分:1)

您是否在Project>中启用了“大字符串”,“范围检查”和“溢出检查”选项>编译器? 删除所有项目DCU文件,并强制项目重建。 这可能有所帮助。

答案 3 :(得分:-1)

您的文本文件可能包含无效字符,如#0(字符串结尾)。考虑这样的字符串:

sString:='这是一个带有巨大问题的字符串#0。

如果你执行ShowMessage(sString),它只会显示“This a string”,因为#0表示字符串结束符。

记住你实际上看不到#0字符,你可能需要创建一个程序来搜索这个字符并删除它。

更好的解决方案是根本不使用TStringList,也不使用Wite()。使用Stream descendent,就像TFileStream一样,可以彻底摆脱这个问题。