对于迭代过程中的“美味”输出,我想在Fortran中使用以下方法(我在C ++中编写了一些程序)。 每次新的迭代都会在控制台中为我提供相应的信息:
Iteration XX Accuracy X.XXXXE-XX Time spent XX seconds
我希望每一个新行都替换前一行(即标签“Iteration”“Accuracy”...等等保持不变,而值会改变)。
我尝试了不同的变体,包括
backspace(6)
backspace(0)
write (*,*) char(8)//'Accuracy ...'
当然,前两行给出了运行时错误,而最后一行没有给出任何内容。
我该如何实施这种方法?
答案 0 :(得分:1)
这可能是一个相当复杂的解决方案,但一种选择是使用ncurses
库 - http://genepi.qimr.edu.au/staff/davidD/
以下是可从链接页面下载的程序testcurs.f90
的修改。它只显示正在逐步更新的进度消息。为了测试它,您还需要ncurses.f90
模块,然后链接到-lncurses
,即
gfortran -c ncurses.f95
gfortran -o test testcurs.f95 -lncurses
示例(仅显示程序本身,testcurs.f90
还包含initTest
等的定义。)
program testcurses
use curses
use commands
type (C_PTR) :: iwin = C_NULL_PTR
integer (C_INT) :: key
integer :: istat, new_option=1, old_option=0
CHARACTER(LEN=1024) :: msg
call initTest(iwin, istat)
if (istat /= 0) then
write(*,'(a)') 'ERROR: initscr failed!'
stop
end if
ierr = wbkgd(iwin, curses_a_reverse)
ierr = erase()
ierr = attrset(curses_a_bold)
DO i = 10, 100, 10
WRITE(msg, '(''Progress '', I0, ''%'')') i
ierr = mvaddstr(20, 20, TRIM(msg) // C_NULL_CHAR)
ierr = refresh()
CALL SLEEP(1)
END DO
key = getch()
ierr = delwin(iwin)
ierr = endwin()
end program testcurses