2009-09-07 4 views
5

コンソール画面で、DOループで行われた計算の進捗状況を表示します。私はこのような端末に進捗変数を印刷することができる:コンソール画面の現在の行を上書きするためにPRINTまたはWRITE文をフォーマットするにはどうすればよいですか?

PROGRAM TextOverWrite_WithLoop 
IMPLICIT NONE 
INTEGER :: Number, Maximum = 10 
DO Number = 1, MAXIMUM 
    WRITE(*, 100, ADVANCE='NO') REAL(Number)/REAL(Maximum)*100  
    100 FORMAT(TL10, F10.2) 
    ! Calcultations on Number  
END DO  
END PROGRAM TextOverWrite_WithLoop 

コンソール画面上に上記のコードの出力である:

10.00 20.00 30.00 40.00 50.00 60.00 70.00 80.00 90.00 100.00

すべてが同じ行にあり、コンソールウィンドウでのみラップされます。

ADVANCE =「いいえ」引数とTL10(タブは非常に多くのスペースを残して)編集記述子は、例えば、同じ行にテキストを上書きするために適しています次のコードの出力:

WRITE(*, 100, ADVANCE='NO') 100, 500 
100 FORMAT(I3, 1X, TL4, I3) 

です:

の代わりに:のでTL4編集記述子の

これらの2つのインスタンスから、WRITEステートメントは、別のWRITEステートメントまたは同じWRITEサテイメント(DOループと同じ)の以前の実行によって上書きされないと結論づけることができます。

これは何とか解決できますか?

Windows 7 RC1でFTN95コンパイラを使用しています。 (G95コンパイラのセットアッププログラムは、Windows 7 RC1をbluescreenしても、Vista上で正常に動作すると思っていました)

私は質問Supressing line breaks in Fortran 95 write statementsについて知っていますが、その質問に対する答えは新しい出力を意味するので同じ行の前の出力に追加されます。以前の出力を上書きする新しい出力の代わりに。

ありがとうございます。

+0

あなたはどのコンパイラとOSをお使いですか? – DigitalRoss

+0

@ digitalross、コンパイラ= FTN95、OS = Windows 7 RC1 – systemovich

+0

あなたは答えを受け入れるべきでしょうか? –

答えて

3

Fortran標準の範囲内でこの問題を解決する方法はありません。 (あなたはオプション-fbackslashを使用する場合はGNU Fortranはありません)Fortranの文字列にバックスラッシュを理解し、あなたのコンパイラしかし、もし、あなたがこれはその行に、以前に書かれた文字を消去するためにバックスラッシュ文字(\b)を使用しています

write (*,"(A)",advance="no") "foo" 
    call sleep(1) 
    write (*,"(A)",advance="no") "\b\b\bbar" 
    call sleep(1) 
    write (*,"(A)",advance="no") "\b\b\bgee" 
    call sleep(1) 
    write (*,*) 
    end 

を書くことができます。

NB:コンパイラがadvance="no"を理解できない場合は、フォーマット文字列に$という指定子を使用するなど、関連する非標準的な方法を使用できます。

8

以下は、キャリッジリターンをエンコードするためにACHAR(13)を使用して、システム間で移植可能である必要があります。

  character*1 creturn 
    ! CODE:: 
      creturn = achar(13) ! generate carriage return 
    ! other code ... 
      WRITE(* , 101 , ADVANCE='NO') creturn , i , npoint 
101  FORMAT(a , 'Point number : ',i7,' out of a total of ',i7) 
+0

[コード/]タグ(またはインデント)を使用して、コードの構文を強調して読みやすくします。 :) –

-1
OPEN(6,CARRIAGECONTROL ='FORTRAN') 
DO I=1,5 
WRITE(6,'(1H+" ",I)') I 
ENDDO 
+0

一般的に、回答には、コードが意図していることの説明と、他のものを導入せずに問題を解決する理由が含まれていると、はるかに役立ちます。 (この投稿には少なくとも1人のユーザーがフラグを立てていた、おそらく説明なしで答えを削除すべきだと思ったからかもしれないし、おそらく "おそらく"はハックルを上げただろう) –

+0

これは説明に値する。注意: 'CARRIAGECONTROL ='は標準に準拠しておらず、再オープンユニット6(それがoutput_unitであると仮定しよう)は、特に非標準の指定子では扱いにくい場合があります。また、ホレリスは現代のFortranから削除されています。 '' 1H + '' 'の意味を説明する必要があります。また、標準のFortranでは 'I0'を使う必要があります。' I'は許されません。 –

0

以下、G95 FORTRANを使用して完全に働いた:

 NF = NF + 1 
     IF(MOD(NF,5).EQ.0) WRITE(6,42,ADVANCE='NO') NF, ' PDFs'//CHAR(13) 
    42 FORMAT(I6,A) 

を与えた: 5つのPDFファイル

を同じライン上の#1の位置にカーソルを残します。次回の更新では、 が5になります。ASCII 13(10進数)は復帰です。

関連する問題