Fortran子例程中进度条重复打印问题求助
Fortran进度条子例程重复输出问题解决
问题原因
- 多余换行输出:子例程中的
write(*, *)和末尾的write(*, *) ""会输出换行符,导致每次调用进度条都在新行显示,无法通过char(13)(回车符)覆盖原有内容。 - 重复初始提示:子例程开头的
write(*, '(a17)', advance='no') ' Progress : 00.0%'每次调用都会执行,造成重复输出。 - 进度计算异常:循环中
progress = i / real(atomCount - 1)会导致最后一次进度超过100%(当i=atomCount时,值为atomCount/(atomCount-1)),可能引发显示异常。
解决办法及修改后的代码
修改后的进度条子例程
subroutine print_progress_bar(progress) implicit none real, intent(in) :: progress integer :: PBWIDTH = 60 character(len=60) :: PBSTR = "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||" character(len=60) :: CTPBSTR integer :: lpad ! 计算进度条填充长度 lpad = int(progress * (PBWIDTH + 1)) CTPBSTR = PBSTR(1:lpad) CTPBSTR(lpad + 1: PBWIDTH) = ' ' ! 回到行首,覆盖原有内容 write(*,'(a, a, f5.1, a1, a1, a, a, a)', advance="no") & char(13), ' progress: ', progress*100, '%', '[', CTPBSTR, ']' flush(6) ! 强制刷新输出缓冲区 end subroutine print_progress_bar
修改后的调用循环
progress = 0.00 ! 先输出初始进度条框架(只执行一次) write(*, '(a, a, f5.1, a1, a1, a, a, a)', advance="no") & ' progress: ', 0.0, '%', '[', repeat(' ', 60), ']' flush(6) do i = 1, atomCount call print_progress_bar(progress) ! 修正进度计算,确保进度范围在0~1之间 progress = real(i) / real(atomCount) end do ! 循环结束后换行,避免后续输出和进度条重叠 write(*, *) ""
关键修改说明
- 移除了所有输出换行的语句,确保所有进度条内容都在同一行更新。
- 将初始进度框架的输出移到循环外,只执行一次,避免重复输出。
- 修正了进度计算逻辑,
progress = real(i)/real(atomCount)保证最后一次循环进度刚好为100%。 - 合并了多个
write语句,减少IO操作,同时确保所有输出都使用advance='no',配合char(13)实现行首覆盖。
内容的提问来源于stack exchange,提问作者Stochastic Cactus
相关产品推荐
相关产品推荐

