单个命令打开文件或创建文件并追加数据

25

我想知道在Fortran中是否可以使用单个命令(带有选项/说明符)来执行以下操作:

  1. 如果存在文件,则打开文件并追加一些数据 (可以使用以下代码完成:open(unit=40,file='data.data',Access = 'append',Status='old'),但如果文件不存在,则会发出运行时错误)

  2. 如果文件不存在,则创建文件并写入一些数据。

我目前正在使用inquire检查文件是否存在,但然后仍然需要使用open语句来附加或写入数据。


5
请注意,access属性只允许使用“sequential”或“direct”作为取值。我猜你的意思是使用position="append"代替。 - Bálint Aradi
4个回答

34
据我所知,唯一 安全 的解决方案是继续使用你已经在做的方式,针对不同情况使用不同的 open 语句:
program proba
  implicit none

  logical :: exist

  inquire(file="test.txt", exist=exist)
  if (exist) then
    open(12, file="test.txt", status="old", position="append", action="write")
  else
    open(12, file="test.txt", status="new", action="write")
  end if
  write(12, *) "SOME TEXT"
  close(12)
end program proba

你可能会对我的Fortran接口库libc文件系统调用(modFileSys)感兴趣,它可以直接查询文件状态,至少可以节省逻辑变量和inquire语句:

if (file_exists("test.txt")) then
    ...
else
    ...
end if

当然,您可以轻松地自己编写类似的函数,但它并不能使您免于两个open语句…


你链接的Fortran接口似乎已被删除。 - jvriesem

9
open(61,file='data.txt',action='write',position='append')
write(61,*) 'hey'
close(61)

这将追加到现有文件,否则创建并写入。添加 status='unknown' 将是等价的。

4

如果您将状态从“旧”更改为“未知”,则无论文件是否存在,您都不会收到运行时错误。

谢谢


据我所知,如果指定为“unknown”,则文件的状态取决于文件系统。 - Bálint Aradi
2
“未知”实际上是“打开”的默认状态。 - Kyle Kanos
是的,你甚至可以完全删除状态说明符吗? - zbeekman
2
另外,正如其他人指出的那样,它需要是 position='append' - zbeekman

-1
在open语句中添加以下属性access
Open(unit=031,file='filename.dat',form='formatted',status='unknown',access='append')

以上语句将打开文件而不破坏旧数据,写入命令将在文件中添加新行。Fortran 90 的最简单解决方案。


3
这与Fortran 90毫不相干,请参见下面问题下方的评论。此外,请注意问题中已经有access='append'。也许你想表达的是Nick在他下面的回答中提到的内容? - Vladimir F Героям слава
1
哦呀,我犯了一个错误。是的,我应该提到状态而不是访问,不过无论如何这已经得到解答。我在理解问题时非常着急。谢谢。 - Mubeena Shaikh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接