Delphi 2010 WriteLn to TextFile обрезает около 55 символов - PullRequest
0 голосов
/ 21 января 2011

Учитывая этот беспорядок (разработанный несколько лет назад для записи некоторых данных 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 ]

5 голосов
/ 21 января 2011

Возможны два варианта исправления:

1) Вместо знака + между каждой строкой просто используйте вместо.Это позволит 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 голос
/ 21 января 2011

Вы включили "огромные строки", "проверку диапазона" и "проверку переполнения" в Project> Options> Compiler? Удалите все файлы DCU ваших проектов и принудительно пересоберите проект. Это может помочь.

1 голос
/ 21 января 2011

По причинам, которые я, возможно, никогда не пойму, акт наблюдения строковых данных заставил их усечь. ShowMessage () и без остановок записывает файл нормально.

Поставь ShowMessage () или останови и не бросай кости.

Квант Дельфи?

Возможно, вызов Flush помог бы, если бы ShowMessage () обрезал до 55 символов?

0 голосов
/ 21 января 2011

Ваш текстовый файл может содержать недопустимые символы, такие как # 0 (конец строки).Рассмотрим строку, подобную этой:

sString: = 'Это строка № 0 с огромной проблемой'.

Если вы выполните ShowMessage (sString), он будет отображать только "Эта строка"потому что # 0 указывает на конец символа строки.

Помните, что вы на самом деле не можете видеть символ # 0, вам может потребоваться создать процедуру для поиска этого символа и удаления его.

* 1008Лучшим решением было бы вообще не использовать TStringList и не использовать Wite ().Используйте потомок Stream, такой как TFileStream, чтобы навсегда избавиться от этой проблемы.
...