2011-01-20 9 views
0

この混乱(何年か前にcsv "field1"、 "field2"からいくつかのデータを書き込むように設計されています)を考えると、出力ファイルは約55文字で停止し始めました。 showmessage()呼び出しやローカルのString変数の内部で同じことが起こります。コードをクリーンアップするためにTStringListに変換することも、同じ方法で失敗します。コードが停止している間にIDEのローカル文字列変数としてこれを調べると、ビルドされた文字列全体が計画通りに表示されます。 ShowMessage()は末尾に末尾の省略記号をつける。Delphi 2010 WriteLn to TextFile約55文字を切り捨てます

showmessageで "LD"、 "BC63781S"、 "JACKSON"、 "MS"、 "DENVER"、 "CO"、 "1186"、 "0" ... "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 
    + '","","","","",""' 
) 
+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

@リチャード:私はあなたのコメントをよく理解していません。ごめんなさい。 bufferについては、system.Textにデフォルトバッファがあります。バッファがいっぱいになると、ディスクに書き込まれます。 SetTextBuf()関数は、このバッファを大きくすることしかできないため、ディスク上にファイルを書き込むためのWindows APIへの呼び出しを減らすので、処理速度が向上します。バッファーは答えの一部ではありませんでした。速くするためのちょっとしたヒントです。 –

1

読みやすくは切り捨てることを余儀なくされました。 ShowMessage()を呼び出すと、ファイルを正常に出力できます。

ShowMessage()または停止してサイコロを入れないでください。

Quantum Delphi?

おそらくFlushコールは、なぜShowMessage()が55文字で切り捨てられるのかを助けてくれたでしょうか?

+2

ShowMessage()のコードはどのように見えますか? –

1

プロジェクト>オプション>コンパイラで "巨大な文字列"、 "範囲チェック"、 "オーバーフローチェック"を有効にしましたか? すべてのプロジェクトDCUファイルを削除し、強制的にプロジェクトを再構築します。 これは役に立ちます。

-1

あなたのテキストファイルの5月には、#0(文字列の末尾)などの無効な文字が含まれています。

sString:= 'これは文字列#0に大きな問題があります'。

ShowMessage(sString)を実行すると、#0は文字列の末尾を示すため、「This a string」と表示されます。

実際に#0文字が表示されないことがわかっているので、この文字を検索して削除する手順を作成する必要があります。

もっと良い解決策は、TStringListをまったく使用しないことです.Wite()も使用しないでください。この問題をなくすには、TFileStreamのようなストリームの子孫を使用してください。

+0

申し訳ありませんが、これは逆です:ShowMessageは動作していましたが、writelnは動作しませんでした。そして、質問にはTStringListのトラックがありません - おそらくそれは提案でしたが、あなたの構文は "TStringListを使用しない"という明確なものではありません。現代のデルファイでは、書き込みは非常に良いアイデアではない、あなたは完全に正しい。 –

+0

あなたは、 "コードをクリーンアップするTStringListへの変換も同じ方法で失敗する"と書いています。 " ShowMessageは、新しいデルファイのバージョンで動作する可能性があります。 –

関連する問題