2009-09-07 13 views
5

Desidero visualizzare l'andamento di un calcolo eseguito con un ciclo DO, sullo schermo della console. Posso stampare la variabile di avanzamento al terminale come questo:Come si formatta un'istruzione PRINT o WRITE per sovrascrivere la riga corrente sullo schermo della console?

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 

L'uscita del codice di cui sopra sullo schermo della console è:

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

Tutti sulla stessa riga, avvolti solo dalla finestra della console.

Il ADVANCE = 'No' argomento e l'TL10 (scheda ha lasciato tanti spazi) descrittore di modifica funziona bene per sovrascrivere il testo sulla stessa riga, per esempio l'output del seguente codice:

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

è:

Invece di:

A causa del descrittore TL4 modifica.

Da questi due casi si può concludere che l'istruzione WRITE non può sovrascrivere ciò che è stato scritto da un'altra istruzione WRITE o da una precedente esecuzione dello stesso WRITE satement (come in un DO-loop).

Questo può essere superato in qualche modo?

Sto utilizzando il compilatore FTN95 su Windows 7 RC1. (Il programma di installazione del compilatore G95 bluescreens Windows 7 RC1, anche pensato che funzioni bene su Vista.)

So della domanda Supressing line breaks in Fortran 95 write statements, ma non funziona per me, perché la risposta a questa domanda significa nuova uscita viene aggiunto all'output precedente sulla stessa linea; invece di un nuovo output che sovrascrive l'output precedente.

Grazie in anticipo.

+0

In quale compilatore e sistema operativo si? – DigitalRoss

+0

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

+0

Forse dovresti accettare una risposta? –

risposta

3

Non esiste una soluzione a questa domanda nell'ambito degli standard Fortran. Tuttavia, se il compilatore capire barra rovesciata nelle stringhe Fortran (GNU Fortran fa se si utilizza l'opzione -fbackslash), è possibile scrivere

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 

Questo utilizza la barra rovesciata (\b) per cancellare i caratteri scritti in precedenza su quella linea.

NB: se il compilatore non capisce advance="no", è possibile utilizzare trucchi non standard correlati, come l'uso dello specificatore $ nella stringa di formato.

8

Quanto segue deve essere portatile tra i sistemi utilizzando ACHAR(13) per codificare il ritorno a capo.

  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

Dovresti usare i tag [code /] (o indentazione) per sintassi evidenzia il tuo codice e renderlo più leggibile. :) –

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

In genere, le risposte sono molto più utili se includono una spiegazione di ciò che il codice è destinato a fare e perché questo risolve il problema senza introdurre gli altri. (Questo post è stato contrassegnato da almeno un utente, presumibilmente perché pensava che una risposta senza spiegazione dovesse essere eliminata. O forse il "probabilmente" ha sollevato i loro problemi.) –

+0

Questo merita una spiegazione. Nota 'CARRIAGECONTROL =' non è standard conforme e l'unità di riapertura 6 (supponiamo che sia l'unità output_) può essere difficile, in particolare con gli specificatori non standard. Inoltre, Holleriths viene eliminato dal Fortran moderno. Dovresti spiegare il significato di 'the 1H +" "'. Inoltre, in Fortran standard devi usare 'I0', solo 'I' non è permesso. –

0

Di seguito funzionava perfettamente utilizzando FORTRAN G95:

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

dato: 5 PDF

lasciando il cursore nella posizione # 1 della stessa linea. Al prossimo aggiornamento, il 5 è diventato un 10. ASCII 13 (decimale) è un ritorno a capo.

Problemi correlati