我想在控制台屏幕上显示使用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,但它对我不起作用,因为该问题的答案意味着新的输出被添加到同一行的前一个输出中;而不是新的输出覆盖以前的输出。
提前致谢。
答案 0 :(得分: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)
答案 1 :(得分:3)
在Fortran标准的范围内,这个问题没有解决方案。但是,如果编译器理解Fortran字符串中的反斜杠(如果使用选项-fbackslash
,则GNU Fortran会这样做),您可以编写
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"
,你可以使用相关的非标准技巧,例如在格式字符串中使用$
说明符。
答案 2 :(得分: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(十进制)是一个回车。
答案 3 :(得分:-2)
OPEN(6,CARRIAGECONTROL ='FORTRAN')
DO I=1,5
WRITE(6,'(1H+" ",I)') I
ENDDO