2009-09-07 6 views
5

Ich möchte den Fortschritt einer Berechnung, die mit einer DO-Schleife durchgeführt wurde, auf dem Konsolenbildschirm anzeigen. Ich kann so den Fortschritt Variable an das Terminal ausdrucken:Wie formatiere ich eine PRINT oder WRITE-Anweisung, um die aktuelle Zeile auf dem Konsolenbildschirm zu überschreiben?

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 

Die Ausgabe des obigen Codes auf dem Konsolenbildschirm ist:

10,00 20,00 30,00 40,00 50,00 60,00 70,00 80,00 90,00 100,00

Alle in derselben Zeile, nur vom Konsolenfenster umschlossen.

Die ADVANCE = ‚Nein‘ Argument und die TL10 (Tab links so viele Leerzeichen) Bearbeitungsbeschreibung funktioniert gut Text auf der gleichen Linie zu überschreiben, z.B. die Ausgabe des folgenden Code:

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

ist:

Statt:

Wegen der TL4 Bearbeitungsbeschreibung.

Aus diesen beiden Instanzen kann man schließen, dass die WRITE-Anweisung nicht überschreiben kann, was von einer anderen WRITE-Anweisung oder von einer vorherigen Ausführung derselben WRITE-Anweisung (wie in einer DO-Schleife) geschrieben wurde.

Kann das irgendwie überwunden werden?

Ich verwende den FTN95-Compiler auf Windows 7 RC1. (Das Setup-Programm des G95-Compilers Bluescreens Windows 7 RC1, sogar dachte, es funktioniert gut auf Vista.)

Ich weiß über die Frage Supressing line breaks in Fortran 95 write statements, aber es funktioniert nicht für mich, weil die Antwort auf diese Frage neue Ausgabe bedeutet wird zur vorherigen Ausgabe in derselben Zeile hinzugefügt; anstelle eines neuen Ausgangs, der die vorherige Ausgabe überschreibt.

Vielen Dank im Voraus.

+0

Mit welchem ​​Compiler und Betriebssystem arbeiten Sie? – DigitalRoss

+0

@digitalross, Compiler = FTN95, OS = Windows 7 RC1 – systemovich

+0

Vielleicht sollten Sie eine Antwort akzeptieren? –

Antwort

3

Es gibt keine Lösung für diese Frage im Rahmen der Fortran-Standards. Allerdings, wenn Ihr Compiler Backslash in Fortran Strings verstehen (GNU Fortran tut, wenn Sie die Option -fbackslash verwenden), können Sie

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 

Dieses verwendet den umgekehrten Schrägstrich (\b) schreiben zuvor geschriebenen Zeichen in dieser Zeile zu löschen.

Hinweis: Wenn Ihr Compiler advance="no" nicht versteht, können Sie verwandte nicht standardmäßige Tricks verwenden, z. B. den $-Spezifizierer im Formatzeichenfolge verwenden.

8

Das folgende System sollte über die Verwendung von ACHAR(13) für die Codierung des Wagenrücklaufs portabel sein.

  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

Sie sollten die [code /] Tags (oder Einrückungen) verwenden, um den Code zu markieren und ihn lesbarer zu machen. :) –

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

Im Allgemeinen sind Antworten viel hilfreicher, wenn sie eine Erklärung enthalten, was der Code tun soll, und warum das das Problem löst, ohne andere einzuführen. (Dieser Beitrag wurde von mindestens einem Benutzer markiert, vermutlich weil er dachte, eine Antwort ohne Erklärung sollte gelöscht werden. Oder vielleicht haben die "wahrscheinlich" ihre Nackenhaare angehoben.) –

+0

Dies verdient eine Erklärung. Hinweis 'CARRIAGECONTROL =' ist keine standardkonforme und wiederöffnende Einheit 6 (angenommen, es ist die output_unit) kann schwierig sein, besonders bei Nicht-Standardspezifizierern. Auch Holleriths sind aus dem modernen Fortran gelöscht. Sie sollten die Bedeutung von "the 1H +" erklären. Außerdem müssen Sie im Standard Fortran "I0" verwenden, nur "I" ist nicht erlaubt. –

0

Die folgende arbeitete mit perfekt g95 Fortran:

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

gab: 5 PDFs

den Cursor an die auf der gleichen Linie # 1 Position zu verlassen. Beim nächsten Update, wurde die 5 in eine 10. ASCII 13 (Dezimal) ist ein Wagenrücklauf.

Verwandte Themen