假设我有一个数据文件 (fort.100),其中包含如下数据,
2.34, 4.5
(23.1,0.3), 4.5
(3.1,0.3), (3.2,1.0)
2.4, (32.2,12.0)
如何将这些混合的实数和复数值读入复数变量? 换句话说,下面的简单方法在 gfortran 中不起作用。
program readmixnum
implicit none
integer::i
complex::cdat(4,2)
do i=1, 4
read(100,*) cdat(i,1:2)
write(*,*) cdat(i,1:2)
end do
end program
实际上,我们可以为复杂变量分配一个实数值,但为什么不能读取实数值。我想知道必须有一个非常简单的解决方案。
最佳答案
请尝试将此作为您问题的简单解决方案:
program readmixnum
implicit none
integer::i,st
character*256::line
real::rdat(4,2)
complex::cdat(4,2)
do i=1, 4
read(100,'(A)',iostat=st) line
read(line,*,iostat=st) rdat(i,:)
cdat(i,:) = rdat(i,:)
if (st /= 0) then
read(line,*,iostat=st) rdat(i,1), cdat(i,2)
cdat(i,1) = rdat(i,1)
if (st /= 0) then
read(line,*,iostat=st) cdat(i,1), rdat(i,2)
cdat(i,2) = rdat(i,2)
if (st /= 0) then
read(line,*,iostat=st) cdat(i,:)
endif
endif
endif
write(*,*) cdat(i,1:2)
end do
end program
它需要一个与复矩阵 cdat
具有相同秩的实数矩阵 rdat
。输入文件 fort.100
的一行保存在 line
变量中。这可以防止在检查数字格式时使用 backspace
语句。
数字格式的检查是通过iostat
参数完成的。如果此值等于 0,则读取成功且数字格式正确。挑战是尝试所有可能的组合。
输出是:
( 2.33999991 , 0.00000000 ) ( 4.50000000 , 0.00000000 )
( 23.1000004 , 0.300000012 ) ( 4.50000000 , 0.00000000 )
( 3.09999990 , 0.300000012 ) ( 3.20000005 , 1.00000000 )
( 2.40000010 , 0.00000000 ) ( 32.2000008 , 12.0000000 )
用于在 Linux 机器上使用 gfortran
版本 6.3.0 进行编译。
希望对您有所帮助。
关于fortran - Fortran中如何统一读取实数和复数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58811066/