如何格式化PRINT或WRITE语句以覆盖控制台屏幕上的当前行?

sys*_*ich 8 printing formatting fortran

我想在控制台屏幕上显示使用DO循环完成的计算的进度.我可以将进度变量打印到终端,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

控制台屏幕上的上述代码输出为:

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)
Run Code Online (Sandbox Code Playgroud)

方法是:

500

代替:

100 500

由于TL4编辑描述符.

从这两个实例可以得出结论,WRITE语句不能覆盖由另一个WRITE语句写入的内容或者先前执行相同的WRITE语句(如在DO循环中).

这可以以某种方式克服吗?

我在Windows 7 RC1上使用FTN95编译器.(G95编译器的安装程序蓝屏Windows 7 RC1,甚至认为它在Vista上工作正常.)

我知道Fortran 95写语句中的抑制换行问题,但它对我不起作用,因为这个问题的答案意味着新的输出被添加到同一行的前一个输出中; 而不是新的输出覆盖以前的输出.

提前致谢.

小智 13

以下内容应通过使用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)
Run Code Online (Sandbox Code Playgroud)


F'x*_*F'x 3

Fortran 标准范围内没有解决这个问题的方法。但是,如果您的编译器理解 Fortran 字符串中的反斜杠(如果您使用选项,GNU Fortran 就会理解-fbackslash),您可以编写

  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
Run Code Online (Sandbox Code Playgroud)

这使用反斜杠字符 ( \b) 来删除该行上先前写入的字符。

注意:如果您的编译器不理解advance="no",您可以使用相关的非标准技巧,例如$在格式字符串中使用说明符。