Fortran90 - 编译后的程序创建一个空白的 csv 文件而不是读取现有文件
Fortran90 - compiled program creates a blank csv file instead of reading the existing one
简而言之:我正在尝试加载一个 csv 文件,但程序总是将现有文件覆盖为一个空的新文件。
更长:我是 Fortran 的新手,请多多包涵。我正在尝试将数据从 csv 文件读取到 fortran 程序中。现在我没有写程序而且它很大,所以我不能 post 这里的全部内容。该程序由一大堆 .f90 文件组成,所有内容都是使用 makefile 编译的。现在因为我在编译之前加载了 gcc 模块,所以我假设它是使用 GNU Fortran 编译的,因为它是 gcc 的一部分。 (我不知道如何确定这是否正确)
编译器returns 不同目录中的可执行文件。当我在该目录中执行该程序时,它显然会用一个新的空白文件覆盖现有的 .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 文件的方法?
感谢您的宝贵时间。
Fortran 中的 open 语句 OPEN(connect-spec-list)
,有很多连接规范,定义了如何管理外部文件(参见。Fortran 2018 Standard sec 12.5.6)。
当您使用最简单形式的打开语句打开文件时:
OPEN(unit=unitid,file="filename")
做出了许多默认假设,例如:ACCESS="SEQUENTIAL", ASYNCHRONOUS="NO", BLANK="NULL", ...
。然而,最重要的是 ACTION
和 STATUS
,它们定义了文件的用途。操作规范说明您是否要将文件用于读、写或两者,而 status
本质上定义了我们是否处理现有文件,以及我们应该如何处理它(替换它,保留它, ...)
这两个规范都有默认的编译器依赖状态。
在Intel compiler suit中,默认是action="readwrite", status="unknown"
(参见here and here)
Intel 将 status="unknown"
定义为: 表示该文件可能存在也可能不存在。如果该文件不存在,则创建一个新文件,其状态更改为 'OLD'.
Gnu 编译器套件对此有不同的看法。默认操作由一组规则定义,这些规则取决于文件存在时的可访问性 (+rw,+r-w,-r+w
)(参见 here). The behaviour for the default action="unknown"
is not documented but seems to be REWRITE
(see Default Status of "Unknown" in Open)
如果您知道要对文件做什么,建议使用正确的方法:
OPEN(newunit=unitid, file="filename", action="read", status="old")
简而言之:我正在尝试加载一个 csv 文件,但程序总是将现有文件覆盖为一个空的新文件。
更长:我是 Fortran 的新手,请多多包涵。我正在尝试将数据从 csv 文件读取到 fortran 程序中。现在我没有写程序而且它很大,所以我不能 post 这里的全部内容。该程序由一大堆 .f90 文件组成,所有内容都是使用 makefile 编译的。现在因为我在编译之前加载了 gcc 模块,所以我假设它是使用 GNU Fortran 编译的,因为它是 gcc 的一部分。 (我不知道如何确定这是否正确)
编译器returns 不同目录中的可执行文件。当我在该目录中执行该程序时,它显然会用一个新的空白文件覆盖现有的 .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 文件的方法?
感谢您的宝贵时间。
Fortran 中的 open 语句 OPEN(connect-spec-list)
,有很多连接规范,定义了如何管理外部文件(参见。Fortran 2018 Standard sec 12.5.6)。
当您使用最简单形式的打开语句打开文件时:
OPEN(unit=unitid,file="filename")
做出了许多默认假设,例如:ACCESS="SEQUENTIAL", ASYNCHRONOUS="NO", BLANK="NULL", ...
。然而,最重要的是 ACTION
和 STATUS
,它们定义了文件的用途。操作规范说明您是否要将文件用于读、写或两者,而 status
本质上定义了我们是否处理现有文件,以及我们应该如何处理它(替换它,保留它, ...)
这两个规范都有默认的编译器依赖状态。
在Intel compiler suit中,默认是action="readwrite", status="unknown"
(参见here and here)
Intel 将 status="unknown"
定义为: 表示该文件可能存在也可能不存在。如果该文件不存在,则创建一个新文件,其状态更改为 'OLD'.
Gnu 编译器套件对此有不同的看法。默认操作由一组规则定义,这些规则取决于文件存在时的可访问性 (+rw,+r-w,-r+w
)(参见 here). The behaviour for the default action="unknown"
is not documented but seems to be REWRITE
(see Default Status of "Unknown" in Open)
如果您知道要对文件做什么,建议使用正确的方法:
OPEN(newunit=unitid, file="filename", action="read", status="old")