在FORTRAN中读取输入文件

lol*_*ger 3 fortran

目的:创建一个程序,它接受两个单独的文件,打开并读取它们,将它们的内容分配给数组,对这些数组进行一些数学运算,创建一个带有产品编号的新数组,打印到一个新文件.够简单吧?

我的输入文件在开头有注释字符.一个问题是,它们是'#',它们是大多数绘图程序的注释字符,但不是FORTRAN.什么是告诉计算机不要查看这些字符的简单方法?由于我之前没有FORTRAN经验,我正在通过两个测试文件来完成这项工作.这是我到目前为止:

PROGRAM gain
  IMPLICIT NONE
  REAL, DIMENSION (1:4, 1:8)     :: X, Y, Z
  OPEN(1, FILE='test.out', &
        STATUS='OLD', ACTION='READ')            ! opens the first file
  READ(1,*), X
  OPEN(2, FILE='test2.out', &
    STATUS='OLD', ACTION='READ')            ! opens the second file
  READ(2,*), Y
  PRINT*, X, Y

  Z = X*Y
!  PRINT*, Z
  OPEN(3, FILE='test3.out', STATUS='NEW', ACTION='WRITE')   !creates a new file
  WRITE(3,*), Z
  CLOSE(1)
  CLOSE(2)
  CLOSE(3)
END PROGRAM
Run Code Online (Sandbox Code Playgroud)

PS.请不要用一堆代码猴子gobblety gook压倒我.我是一个总编程新手.我不懂所有的术语,这就是为什么我来到这里而不是在现有网站上寻求帮助的原因.谢谢.

M. *_* B. 6

如果您的意思是注释仅在文件的开头,那么它非常简单 - 无需计算注释行或倒回文件 - 您可以将这些行读入字符串并测试它们是否是注释.然后你最终会遇到一个非评论行.问题:它将被读入一个字符串,因此无法用于常规读取...解决方案...使用"退格"来读取一条记录,以便您现在可以使用普通文件读取来读取文件的其余部分.如果注释行穿插在整个文件中,则需要稍微复杂的解决方案 - 如前所述,将行读入字符串,然后从字符串中读取.

这是一个有效的例子......我假设"#"在第一列和各种其他简化假设中.一些建议:将子程序和函数放入模块并"使用"该模块 - 这将允许编译器检查接口.在开发程序时,尽可能多地使用代码检查和警告选项 - 特别是下标边界检查 - 最终会节省时间.

PS它自Fortran 90以来正式成为"Fortran" - 它是FORTRAN 77及更早版本的"FORTRAN".

module read_file_module

   implicit none

contains

   subroutine read_file (UnitNum, FileName, NumRows, NumCols, Array )

      integer, intent (in) :: UnitNum
      character (len=*), intent (in) :: FileName
      integer, intent (in) :: NumRows, NumCols
      real, dimension (1:NumRows, 1:NumCols), intent (out) :: Array

      character (len=300) :: line
      integer :: i, j

      open (unit=UnitNum, file=FileName, status='old', action='read' )

      ReadComments: do
         read (UnitNum, '(A)') line
         if (line (1:1) /= "#") exit ReadComments
      end do ReadComments

      backspace (UnitNum)

      do i=1, NumRows
         read (UnitNum, *) (Array (i, j), j=1,NumCols)
      end do

      close (UnitNum)

      return

   end subroutine read_file

end module read_file_module 




program test_prog

use read_file_module

implicit none

real, dimension (1:8, 1:4) :: Array
integer :: i, j

call read_file (66, 'TestFile.txt', 8, 4, Array)

do i=1, 8
  write (*, '( 4(2X, F7.3) )' ) (Array (i, j), j=1,4)
end do

end program test_prog
Run Code Online (Sandbox Code Playgroud)

以及一些测试数据显示输入数据的灵活性:

#  comment one
#  comment two
1.1   2.0  3.0  4.1
1.2   2.0  3.0  4.2
1.3   2.0  3.0  4.3
1.4   
  2.0  3.0  4.4
1.5   2.0  3.0  4.5
1.6   2.0  3.0  4.6


1.7   2.0  3.0  4.7
1.8   2.0  3.0  4.8
Run Code Online (Sandbox Code Playgroud)