如何使用以下代码在具有不同扩展名的文件中写入值?
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=
而不是手动分配单元编号。
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=
而不是手动分配单元编号。