是否可以在将数据附加到文件中之前删除文件?
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循环语法格式化文件名。 一个简单的解决方案是在运行之前每次都删除所有输出文件。
答案 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终端)。