写入现有文件并覆盖并追加 Fortran

Write in an existing file with overwriting and append in Fortran

是否可以在添加数据之前删除文件?

  OPEN(61,file="file.txt",action='write',position='append')
  WRITE(61,*)f(i,j)
  CLOSE(61) 

这将创建 file.txt 并在其中附加值 f(i,j)。整个设置都在 do 循环中。但是如果我下次 运行 相同的代码,它会从它之前写入的最后一个值开始追加。 我想在每次 运行 开始附加数据之前完全删除文件内容。可能吗?

这是一个简单的测试程序:

  program test
  double precision f
  dimension f(10,10,10)
  integer i,j,k
  character*500 ofile
  Do k=1,5
  do i=1,2
   do j=1,2
     f(i,j,k)= i+10d0*j+k
     WRITE(ofile,'(A,F4.2,A,F4.2,A)')'file',i*1d0,'_',j*1d0,'.dat'
     OPEN(61,file=ofile,action='write',position='append')
     WRITE(61,*)k,f(i,j,k)
   enddo
  enddo
  enddo
  CLOSE(61)
  stop
  end

在第一个 运行 中输出是 cat file1.00_1.00.dat :

       1   12.000000000000000
       2   13.000000000000000
       3   14.000000000000000
       4   15.000000000000000
       5   16.000000000000000

在第二个 运行 中它再次开始追加到最后一个 cat file1.00_1.00.dat:

       1   12.000000000000000     
       2   13.000000000000000     
       3   14.000000000000000     
       4   15.000000000000000     
       5   16.000000000000000     
       1   12.000000000000000     
       2   13.000000000000000     
       3   14.000000000000000     
       4   15.000000000000000     
       5   16.000000000000000

我想避免第二种情况。每次我运行,它应该不删除运行,

之前的文件
       1   12.000000000000000
       2   13.000000000000000
       3   14.000000000000000
       4   15.000000000000000
       5   16.000000000000000

注意:我必须在 do 循环中打开文件才能使用 do 循环语法格式化文件名。 一个简单的解决方案是每次在 运行.

之前删除所有输出文件

在您与其他用户进行了所有讨论之后,我只是认为(如前所述)您将这里的事情复杂化了。

以下代码(未经测试并使用您的格式...)应该可以满足您的需求。如果你想对文件名做一些花哨的事情(在讨论中有点不清楚)那么你可能需要做一些其他的事情。

  program test
  double precision f
  dimension f(10,10)
  integer i,j

  OPEN(61,file="file.txt",action='write',status='replace')
  do i=1,2
   do j=1,2
     f(i,j)= i+10d0*j
     WRITE(61,*) f(i,j)
   enddo
  enddo
  CLOSE(61)

  stop
  end

这将始终在每个 运行 中为您提供 file.txt 中您想要的输出。所以你打开文件一次(替换任何以前的版本),在双循环迭代时写入 f 的次数(在同一个文件中的前一个记录之后写入 f 的每条记录,我认为这是您对 append) 感到困惑的地方,然后关闭文件。

编辑

有了您 post 的新示例,问题现在很清楚了。如果您能在原文 post 中进行解释,这会有所帮助并避免很多时间。

解决它的一种方法是在循环内添加一个条件,它检查它是否是循环的第一次迭代(对于每个 k 值)。另请注意,k 循环需要迭代最快(内循环)。

  program test
  double precision f
  dimension f(10,10,10)
  integer i,j,k
  character*500 ofile

  do i=1,2
   do j=1,2
     do k=1,5
       f(i,j,k)= i+10d0*j+k
       WRITE(ofile,'(A,F4.2,A,F4.2,A)')'file',i*1d0,'_',j*1d0,'.dat'
       if (k.eq.1) then
         OPEN(61,file=ofile,action='write',status='replace')
       else
         OPEN(61,file=ofile,action='write',position='append')
       end if
       WRITE(61,*)k,f(i,j,k)
       CLOSE(61)
     enddo
   enddo
  enddo
  stop
  end

如果你想坚持在每个 运行 之前删除文件的想法,只需在开始循环之前添加 call system('rm file*')(这是针对 Unix 终端)。