我有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
答案 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
这将始终打印“读取过去的文件结束”错误,但这只是为了检查如何编程读取。
这应该编译,当你运行它时,它应该给你一些关于出错的信息。