简而言之:我试图加载一个csv文件,但程序总是将现有文件覆盖为一个空的新文件。
Longer:我对Fortran很陌生,所以请原谅我。我正试图从csv文件读取数据到fortran程序。这个程序不是我写的,它太大了,所以我不能把整个都贴在这里。该程序由一大堆.f90文件组成,所有内容都使用makefile进行编译。现在,因为我在编译之前加载了gcc模块,所以我假设它是使用GNU Fortran编译的,因为它是gcc的一部分。(我不知道如何查明这是否正确)
编译器返回不同目录下的可执行文件。当我在该目录中执行程序时,它显然会用一个新的空白文件覆盖现有的.csv文件,因此程序只读取"文件结束"。我不知道为什么它总是创建一个新文件,我如何阻止它这样做?
作为旁注,我试图读取的csv文件只是由一列浮点数组成,例如:0.01, 0.13, 0.041,…等。我插入到.f90文件的子例程中的代码如下:
real*8, dimension(nz) :: Nsq
integer :: i
open(10, file='Nsq.csv')
do i=1,20
read(10, *) Nsq(i)
enddo
close(10)
我也试着写了一个小的测试程序,基本上运行与上面相同的代码。那一个工作得很好,输出csv文件的内容没有任何问题。对于这个,我使用gfortran来编译它。我完全没有使用Fortran的经验,所以我完全被难住了,为什么会发生这种情况。我知道你们能帮我解决这个问题的可能性很小,因为我不能提供整个源代码。但也许有人知道为什么会这样。也许你知道另一种读取csv文件的方法?
感谢您的宝贵时间。
FortranOPEN(connect-spec-list)
中的open语句有很多连接规范,这些规范定义了如何管理外部文件(参见。Fortran 2018 Standard第12.5.6节
当你使用最简单形式的open-statement打开一个文件时:
OPEN(unit=unitid,file="filename")
有很多默认的假设,例如:ACCESS="SEQUENTIAL", ASYNCHRONOUS="NO", BLANK="NULL", ...
。然而,最重要的是ACTION
和STATUS
,它们定义了文件的目的。操作规范说明了您是否希望使用该文件进行读、写或两者兼用,而status
本质上定义了我们是否在现有文件上工作,以及我们应该对它做什么(替换它,保留它,…)
这两个规范都有一个默认的编译器依赖状态。
在Intel编译器套装中,默认值是action="readwrite", status="unknown"
(参见这里和这里)Intel将status="unknown"
定义为:表示该文件可能存在,也可能不存在。
如果该文件不存在,则创建一个新文件并将其状态更改为'OLD'。Gnu编译器套装对此有不同的看法。默认操作由一组规则定义,这些规则取决于文件存在时的可访问性(+rw,+r-w,-r+w
)(参见此处)。默认action="unknown"
的行为没有文档记录,但似乎是REWRITE
(参见默认状态"未知")。在开放)
如果您知道要对文件做什么,建议使用适当的方法:
OPEN(newunit=unitid, file="filename", action="read", status="old")