fortran - 在 FORTRAN 中读取输入文件

标签 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

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

最佳答案

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

这是一个可行的示例...我假设“#”位于第一列以及其他各种简化假设中。一些建议:将您的子例程和函数放入一个模块并“使用”该模块——这将允许编译器检查接口(interface)。在开发程序时,尽可能多地使用代码检查和警告选项——尤其是下标边界检查——最终会节省时间。

附:从 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

还有一些测试数据来展示输入数据的灵 active :

#  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

关于fortran - 在 FORTRAN 中读取输入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2813502/

相关文章:

csv - 如何在Fortran中读取我的csv文件?

file-io - Fortran OPEN(25 ,“file.txt”,iostat = stat)中的语法错误

python - 将 Fortran 77 代码转换为 Python

compiler-errors - Fortran “Error:Expected expression in WRITE statement”

Fortran 运行时警告 : temporary array

python - 检索 virtualenv 中 Python 库的外部 C/Fortran 依赖项列表

java - 从java调用fortran90 exe程序没有执行

fortran - 在 Ubuntu 上编译 Fortran netCDF 程序

fortran - 是否有必要在现代 Fortran 中将 _kind 附加到数字文字?

gcc - "/usr/bin/ld: cannot find library"