写入现有文件并覆盖并追加 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 终端)。
是否可以在添加数据之前删除文件?
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 终端)。