如何在fortran的do-loop的每个步骤中读取文本文件的连续行?

时间:2016-08-24 05:52:23

标签: fortran readfile do-loops

我有30个物种的参数值数据集,我想运行一个脚本,对每个物种进行模拟。参数值当前存储在.txt文件中,其中每行是不同的种类,每列是不同的参数值。我想要做的是设置一个do循环,读取每个物种的相关参数值行,运行模拟脚本,并为每个物种写入输出的.txt文件。不幸的是,我是fortran的新手,并且在do循环的每一步中理解如何从.txt文件中读取连续行时遇到很多麻烦。我尝试制作一个简化的脚本来测试读取步骤是否正常工作:

    PROGRAM DRIVER
    IMPLICIT NONE

    INTEGER :: mm ! I forgot this line in the first version of this question   
    and edited to add it in
    CHARACTER(7) :: species  !! the first column is the species name
    REAL*8    :: leaf_variable   !  The next 3 columns are variable values
    REAL*8    :: stem_variable   !  
    REAL*8    :: root_variable   !  

    OPEN (12, file = "species_parameters.txt") ! open the .txt file

    DO mm = 1,30 ! set up the do loop
        READ (12,*) species, leaf_variable, stem_variable, root_variable
        ! Read in the species-specific parameter values
        WRITE (*,*) species, leaf_variable, stem_variable, root_variable
        ! Print the values on the screen just to show the do loop runs
    ENDDO
    END PROGRAM DRIVER

但是当我去编译时,我得到错误: 在文件XX的第XX行(单位= 12,文件='species_parameters.txt') Fortran运行时错误:文件结束

我对这个文件中的开放和阅读有什么误解?

非常感谢您的帮助。

编辑:我想我已经缩小了我的问题。我的理解是read()一次在.txt文件中占一行,所以在这个例子中:

    read(7, *) species, leaf_variable, stem_variable, root_variable
    read(7, *) species, leaf_variable, stem_variable, root_variable

变量应该等于.txt文件第二行中的值。相反,无论我放入read()函数多少次,变量值都等于第一行。而且,即使只有4列,我可以使用read()函数定义尽可能多的变量:

   read(7, *) species, leaf_variable, stem_variable, root_variable, 
            fake_variable1, fake_variable2, fake_variable3, fake_variable4

其中fake_variable值等于.txt文件第二行中的值。我对read()的作用感到困惑,还是我需要做些什么才能让我的脚本不能将整个.txt文件作为一行读取?

编辑#2:由于我使用TextWrangler使用Unix编码保存了我的.txt文件,因此do循环正确读取。原始文件使用Excel保存为.txt文件。这似乎解决了它,但如果有人建议更好的方式来指定输入文件格式,我会很感激。输入文件的前几行如下所示:

    species1,1.2,6.54,10.9
    species2,1.42,3.5,8.23
    species3,0.85,2.41,4.9 

1 个答案:

答案 0 :(得分:2)

运行时错误是指您有可执行文件,执行它并崩溃。编译时错误是指编译器无法生成可执行文件。

此代码不应编译,因为您有IMPLICIT NONE,但尚未声明整数mm

我建议的是获取更多信息:

program driver
    use iso_fortran_env
    implicit none
    character(len=7) :: species
    real(kind=real64) :: leaf_variable, stem_variable, root_variable
    integer :: u, ioerr
    character(len=120) :: iomsg

    open(newunit=u, file='species_parameters.txt', action='read', status='old', iostat=ioerr, iomsg=iomsg)
    if (ioerr /= 0) then
        print *, "Error opening file"
        print *, trim(iomsg)
        stop 1
    end if
    do
        read(u, *, iostat=ioerr, iomsg=iomsg) species, leaf_variable, stem_variable, root_variable
        if (ioerr /= 0) exit  ! exits the loop
        write(*, *) species, leaf_variable, stem_variable, root_variable
    end do
    print *, trim(iomsg)
    close(u)
end program driver

这将始终打印“读取过去的文件结束”错误,但这只是为了检查如何编程读取。

这应该编译,当你运行它时,它应该给你一些关于出错的信息。