使用覆盖写入现有文件并附加到Fortran

时间:2017-09-23 17:24:41

标签: fortran gfortran

是否可以在将数据附加到文件中之前删除文件?

  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循环语法格式化文件名。 一个简单的解决方案是在运行之前每次都删除所有输出文件。

1 个答案:

答案 0 :(得分:1)

在与其他用户进行了所有讨论后,我认为(如上所述)你在这里过于复杂。

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

  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)混淆的地方,并关闭文件。

修改

使用您发布的新示例,问题现在已经清楚了。如果您可以在原始帖子中解释,这将有助于并避免大量时间。

解决它的一种方法是在循环内添加一个条件,它检查它是否是循环的第一次迭代(对于每个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终端)。