如何使用以下代码在具有不同扩展名的文件中写入值?

How to write the values in files with different extensions by using the below code?

subroutine iswap (file,b)
 implicit none
 integer  b,m
 character*(*) file
 m=1
 do while (file(m:).ne.' ')
    m=m+1
 enddo
 m=m-1
 open(1, File = file(1:m),form='formatted')
 write (1,*) b
 close(1)
 end

 subroutine iswap1 (file,b1,c1)
 implicit none
 integer m,b1,c1
 character*6 file
 m=1
 do while (file(m:).ne.' ')
    m=m+1
 enddo
 m=m-1
 call iswap(file(1:m)//'.jk',b1)
 call iswap(file(1:m)//'.bk',c1)
 end

 program callex
 implicit none
 character*6  unit
 call iswap1(unit,2,3)
 end

我正在尝试编写生成两个文件“.jk”和“.bk”的代码,每个文件都包含值 2 和 3。我编写的代码没有创建任何文件。您能否指导我更正此代码以保持代码格式相同?主程序调用“iswap1”子程序,然后调用“iswap2”子程序,将值写入具有“iswap1”子程序中提到的扩展名的文件。谢谢!

下面是用现代 Fortran 语言粗略编写的代码:


program callex
 implicit none
 character(len=80) :: fname = "thefile"
 call iswap1(fname,2,3)
contains

  subroutine iswap (file,b)
    implicit none
    integer, intent(in)  :: b
    character(len=*), intent(in) :: file
    integer :: unit
    open(newunit=unit, File = file ,form='formatted')
    write (unit,*) b
    close(unit)
  end subroutine iswap
  
  subroutine iswap1 (file,b1,c1)
    implicit none
    integer, intent(in) :: b1,c1
    character(len=*), intent(in) :: file
    call iswap(trim(file)//'.jk',b1)
    call iswap(trim(file)//'.bk',c1)
  end subroutine iswap1  

end program callex

与原始版本相比的一些显着变化:

  • 使用包含的过程进行参数检查。
  • 根据现代语法用长度声明的字符变量。
  • 初始字符变量,fname 已初始化(并变得更长一些,因为为什么不这样做)。此外,我将 fname 初始化为非空字符串,否则在 Unix 类型系统上,生成的文件将被隐藏,因为名称将以 ..
  • 开头
  • len=* 声明的虚拟字符变量意味着它们从调用者那里获得长度。
  • 为虚拟参数声明 intent
  • 使用 trim 而不是循环来去除尾随空格。
  • 打开单元时使用 NEWUNIT= 而不是手动分配单元编号。