2009-09-07 21 views
5

Quiero mostrar el progreso de un cálculo hecho con un bucle DO, en la pantalla de la consola. Puedo imprimir la variable de progreso a la terminal de la siguiente manera:¿Cómo formateo una instrucción IMPRIMIR o ESCRIBIR para sobrescribir la línea actual en la pantalla de la consola?

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 

La salida del código anterior en la pantalla de la consola es:

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

Todos en la misma línea, envueltos solo por la ventana de la consola.

El ADVANCE = 'no' argumento y el TL10 (pestaña dejó tantos espacios) descriptor de edición funciona bien para sobrescribir el texto en la misma línea, por ejemplo, la salida del siguiente código:

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

es:

En lugar de:

Debido a la TL4 descriptor de edición.

De estas dos instancias se puede concluir que la instrucción WRITE no puede sobrescribir lo que ha sido escrito por otra instrucción WRITE o por una ejecución previa del mismo estado de ESCRITURA (como en un DO-loop).

¿Se puede superar esto de alguna manera?

Estoy utilizando el compilador FTN95 en Windows 7 RC1. (El programa de instalación del compilador G95 bluescreens Windows 7 RC1, incluso si funciona bien en Vista.)

Sé de la pregunta Supressing line breaks in Fortran 95 write statements, pero no funciona para mí, porque la respuesta a esa pregunta significa una nueva salida se agrega a la salida anterior en la misma línea; en lugar de una nueva salida sobrescribiendo la salida anterior.

Gracias de antemano.

+0

¿En qué compilador y sistema operativo está usted? – DigitalRoss

+0

@digitalross, compilador = FTN95, sistema operativo = Windows 7 RC1 – systemovich

+0

¿Tal vez debería aceptar una respuesta? –

Respuesta

3

No hay solución a esta pregunta dentro del alcance de los estándares de Fortran. Sin embargo, si el compilador entiende barra invertida en las cadenas de Fortran (GNU Fortran hace si se utiliza la opción -fbackslash), se puede escribir

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 

Esto utiliza la barra invertida (\b) para borrar los caracteres escritos previamente en esa línea.

NB: si su compilador no comprende advance="no", puede utilizar trucos no estándar relacionados, como el uso del especificador $ en la cadena de formato.

8

Lo siguiente debe ser portable en todos los sistemas mediante el uso de ACHAR(13) para codificar el retorno de carro.

  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

Debe usar las etiquetas [code /] (o sangría) para resaltar la sintaxis de su código y hacerlo más legible. :) –

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

En general, las respuestas son mucho más útiles si incluyen una explicación de lo que el código está destinado a hacer, y por qué eso resuelve el problema sin introducir otros. (Esta publicación fue marcada por al menos un usuario, presumiblemente porque pensaron que una respuesta sin explicación debería ser eliminada. O tal vez el "probablemente" les levantó el pelo.) –

+0

Esto merece una explicación. Tenga en cuenta que 'CARRIAGECONTROL =' no es estándar y reabre la unidad 6 (supongamos que es la unidad de salida) puede ser complicado, especialmente con especificadores no estándar. Además, los Holleriths se eliminan del Fortran moderno. Debe explicar el significado de 'the 1H +" "'. Además, en Fortran estándar debes usar 'I0', solo' I' no está permitido. –

0

El siguiente funcionó a la perfección usando FORTRAN g95:

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

dio: 5 PDF

dejando el cursor en la posición # 1 en la misma línea. En la próxima actualización, , el 5 se convirtió en un 10. ASCII 13 (decimal) es un retorno de carro.

Cuestiones relacionadas