8

我想在控制台屏幕上显示使用 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

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

10.00 20.00 30.00 40.00 50.00 60.00 70.00 80.00 90.00 100.00

全部在同一行,仅由控制台窗口包裹。

ADVANCE='No'参数和TL10(制表符留下这么多空格)编辑描述符可以很好地覆盖同一行上的文本,例如以下代码的输出:

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

是:

500

代替:

100 500

因为 TL4 编辑描述符。

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

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

我在 Windows 7 RC1 上使用 FTN95 编译器。(G95 编译器的安装程序蓝屏 Windows 7 RC1,甚至认为它在 Vista 上运行良好。)

我知道Supressing line breaks in Fortran 95 write statements的问题,但它对我不起作用,因为该问题的答案意味着新的输出被添加到同一行的先前输出中;而不是新的输出覆盖以前的输出。

提前致谢。

4

4 回答 4

14

通过使用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)
于 2009-12-12T16:10:40.317 回答
3

在 Fortran 标准的范围内没有解决这个问题的方法。但是,如果您的编译器理解 Fortran 字符串中的反斜杠(如果您使用 option ,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

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

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

于 2009-09-08T15:18:31.147 回答
1

以下使用 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 变成了 10。ASCII 13(十进制)是回车。

于 2015-04-10T17:44:36.870 回答
-3
OPEN(6,CARRIAGECONTROL ='FORTRAN')
DO I=1,5
WRITE(6,'(1H+" ",I)') I
ENDDO
于 2010-03-02T06:53:15.357 回答