fortran - Fortran中如何统一读取实数和复数?

标签 fortran complex-numbers fortran95

假设我有一个数据文件 (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/

相关文章:

C99复铸件

c++ - 自定义类中定义的复数之间的运算符重载

fortran - 在fortran90中智能打印整数

arrays - 在 Fortran 中查找两个数组的交集

fortran - 矩阵上的函数是应用于整个矩阵还是 Fortran 中的每一行?

visual-studio - 固定 Fortran 续行中无法识别的标记 '&'

c++ - VS2010/Intel Fortran 找不到多重定义的符号

fortran - 带有过程参数的通用类型绑定(bind)过程

opencv - 如何在 OpenCV 矩阵中存储复数?

python - 如何用 f2py 编写 genfromtxt?