写的方式覆盖或用Fortran

问题描述:

追加现有的文件是否有可能将其追加数据之前删除的文件吗?写的方式覆盖或用Fortran

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

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

下面是一个简单的测试程序:

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 

注:我必须打开里面的文件做环路格式文件名以做循环语法。 一个简单的解决方案是在运行之前每次移除所有输出文件。

+0

你的意思是_replace_?但是你也可以在开始时定位,所以你需要选择'append'吗? – francescalus

+2

只是删除'position ='append'',默认是覆盖。 – agentp

+0

@francescalus追加的原因是在同一个文件中写入所有f(i,j)与do循环i,j继续。基本上我想停止代码并再次运行,然后它应该写入去除之前写入的所有内容。 –

你不得不与其他用户讨论后,我只是觉得,(如前所述),你在这里过于复杂的事情。

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

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终端)。

+0

谢谢。这不是我想要的。可能是我没有清楚地说出问题。我想打开do循环内的文件。 就mathematica而言,我可以很容易地告诉问题。 1. OUTPUT1 >> file.txt的 OUTPUT2 >>> file.txt的 VS 2. OUTPUT1 >>> file.txt的 OUTPUT2 >>> file.txt的 这两者之间的区别是在病例 - 1每次运行它都会在file.txt中新增,而在case-2中则会附加在旧文件中。也许我应该开始一张明确提及的新票。 注意:fortran中的一个简单的方法是在我运行之前每次删除file.txt。 –

+0

但是,为什么你需要完全打开循环内的文件? –

+0

我在里面打开,因为我的文件名是用do循环语法格式化的。这是一个完整的代码。如果你跑两次,你会知道这个问题。 '程序测试 双精度˚F 尺寸f(10,10,10) 整数i,J,K 字符* 500 OFILE 不要K = 1,10 做= 1,2 做J = 1, '(',(A,F4.2,A,F4.2,A)')'文件',i * 1d0,' (61,*)k,f(i,j,k) ('61,file = ofile,action ='write',position ='append') WRITE enddo enddo enddo CLOSE(61) stop end' –