2011-01-20 1 views
0

csv "field1", "field2"에서 몇 가지 데이터를 작성하기 전에 설계된이 혼란을 감안할 때, 출력 파일은 약 55자를 멈추기 시작했습니다. showmessage() 호출이나 로컬 String 변수 내부에 같은 일이 발생합니다. 코드를 정리하기 위해 TStringList로 변환해도 같은 방식으로 실패합니다. 코드가 정지 된 상태에서 IDE의 로컬 문자열 변수로 검사하면 전체 빌드 된 문자열이 계획대로 표시됩니다. ShowMessage()는 끝에있는 줄임표를 ... 끝에 붙입니다.Delphi 2010 WriteLn to TextFile 약 55자를 자르십시오.

showmessage와 LD에서 "LD", "BC63781S", "JACKSON", "MS", "DENVER", "CO", "1186", "0" 온 디스크 파일에 "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 
    + '","","","","",""' 
) 
+5

귀하의 Git 게시물은 오늘까지 작동했다고 말합니다. 그래서 어제 그것을 바꾸기 위해 무엇을 바꾸 었습니까? –

+0

=)) 이제는 좋은 질문입니다. – ComputerSaysNo

+0

Subversion은 아무 것도 변경되지 않았 음을 확인합니다. –

답변

5

두 수정 possitibilies :

1) 대신 각 문자열 사이에 + 기호, 그냥 대신를 사용합니다. Writeln()이 텍스트 연결을 수행하게합니다.

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

을 유지/또한 수정하는 것이 더 쉬울 것 때문에 내 선호하는 방법입니다 그리고 모든 경우에, 만들 -

  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) 형식()를 오픈 매개 변수 배열을 사용하여 확실히 당신은 어떤 크기의 쓰기 버퍼를 설정 한 및 {$ 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,... 
    ... 
+0

이것은 밖으로 나왔습니다. 특히 파일의 일부분이 CloseFile()이 호출 될 때까지 디스크에 쓰여지고 메모리에 저장되었습니다. 위의 버퍼를 정의하면 CloseFile() (또는 Flush())이 호출되어 버퍼를 디스크에 내려 놓을 때까지 아무 것도 디스크에 저장되지 않습니다. 나는 ShowMesage()가 왜 그렇게했는지 확실하지 않습니다. 대답은 파일을 관찰하기 전에 파일에 데이터를 쓰도록하는 것입니다. –

+0

@ 리차드 : 귀하의 의견을 잘 이해하지 못합니다. 죄송합니다. 버퍼 정보에는 system.Text에 기본 버퍼가 있습니다. 버퍼가 가득 차면 디스크에 기록됩니다. SetTextBuf() 함수는이 버퍼를 더 크게 만들 수 있으므로 디스크에 파일을 쓰는 Windows API 호출을 줄이므로 더 빠릅니다. 버퍼가 응답의 일부가 아니 었습니다. 더 빨리 수행 할 수있는 보너스 힌트였습니다. –

1

더 나은 가독성은 잘라야를 강요했다. ShowMessage() 그리고 멈추지 않아 파일을 정상적으로 출력합니다.

ShowMessage()를 넣거나 주사위를 멈추지 마십시오.

Quantum Delphi?

아마도 플러시 (Flush) 호출은 왜 ShowMessage()가 55 문자로 잘릴 수 있었을까요?

+2

ShowMessage()의 코드는 어떻게 생겼습니까? –

1

프로젝트> 옵션> 컴파일러에서 "거대한 문자열", "범위 검사"및 "오버플로 검사"를 활성화 했습니까? 모든 프로젝트 DCU 파일을 삭제하고 강제로 프로젝트를 다시 빌드하십시오. 도움이 될 수 있습니다.

-1

텍스트 파일은 수도 # 0 (문자열의 끝 부분)와 같은 잘못된 문자가 포함되어 있습니다. 다음과 같은 문자열을 생각해보십시오 :

sString : = '이것은 큰 문제가있는 문자열 # 0'입니다.

ShowMessage (sString)를 실행하면 # 0은 문자열의 끝을 나타내므로 "This a string"만 표시됩니다.

실제로 # 0 숯을 볼 수 없다는 것을 기억하십시오.이 숯을 검색하고 삭제하는 절차를 만들어야 할 수도 있습니다.

더 나은 해결책은 TStringList를 전혀 사용하지 않는 것일뿐 아니라 Wite()를 사용하지 않는 것입니다. 이 문제를 없애려면 TFileStream과 같은 자손 스트림을 사용하십시오.

+0

죄송합니다, 그러나 그 반대입니다 : ShowMessage가 작동하고 writeln은 작동하지 않았습니다. 그리고 질문에 TStringList 트랙이 없습니다. 아마도 제안 이었지만 구문이 "TStringList를 사용하지 않음"으로 명확하지 않습니다. 쓰기는 현대 델파이에서는 그리 좋은 생각이 아닙니다. 당신은 완벽합니다. –

+0

당신은 "코드를 정리하기 위해 TStringList로 변환하는 것조차도 같은 방식으로 실패합니다."라고 썼습니다. ShowMessage는 작동 방식을 변경했기 때문에 최신 델파이 버전에서 작동 할 수 있습니다. –