2014-11-04 63 views
0

我有一个Fortran 95的程序,在这种形式写一个数组文件:我想编辑我的FORTRAN生成FORTRAN

do temp = 1, temp_final 
    do MC = 1, N_MC 
    do x = 0, N 
     do y = 0, M 
     write(1,*) x, y, array(x,y) 
     enddo 
    enddo 
    enddo 
    write(1,*) T 
    T = T - temp*factor 
enddo 

在我的计划,我将这些值到一个文件,但之间两个温度值,我写了不止一次(但是N_MC次)x,y数组(x,y)值,因为它们在MC循环内,上升到N_MC步。由于文件只是生成的,并且程序需要很长时间才能运行,因此如果您可以使用任何技术来编辑已生成的文件并只保留第一组值并将其传送到另一个文件或编辑父文件,并保持变化。

我的文件看起来像这样

Temp 0.69999999999999998 !(initial value) 
     0   0 -1.0000000000000000  
     0   1 -1.0000000000000000  
     0   2 -1.0000000000000000  
     0   3 1.0000000000000000  
     0   4 1.0000000000000000   
     1   0 -1.0000000000000000  
     1   1 1.0000000000000000  
     1   2 1.0000000000000000  
     1   3 -1.0000000000000000  
     1   4 -1.0000000000000000   
     2   0 -1.0000000000000000  
     2   1 1.0000000000000000  
     2   2 -1.0000000000000000  
     2   3 1.0000000000000000  
     2   4 1.0000000000000000   
     3   0 -1.0000000000000000  
     3   1 -1.0000000000000000  
     3   2 1.0000000000000000  
     3   3 -1.0000000000000000  
     3   4 -1.0000000000000000  

     0   0 1.0000000000000000  
     0   1 -1.0000000000000000  
     0   2 1.0000000000000000  
     0   3 1.0000000000000000  
     0   4 -1.0000000000000000   
     1   0 1.0000000000000000  
     1   1 1.0000000000000000  
     1   2 1.0000000000000000  
     1   3 -1.0000000000000000  
     1   4 -1.0000000000000000   
     2   0 -1.0000000000000000  
     2   1 1.0000000000000000  
     2   2 -1.0000000000000000  
     2   3 1.0000000000000000  
     2   4 1.0000000000000000   
     3   0 -1.0000000000000000  
     3   1 -1.0000000000000000  
     3   2 1.0000000000000000  
     3   3 -1.0000000000000000  
     3   4 -1.0000000000000000 
     ..........  
     N_MC-2 times (as two sets are already shown) !(after that there is new temp having new array values) 

Temp 0.59999999999999998 ! like this, I am having array values for diff. temp 
. 
. 
. 
Temp 0.09999999999999998 !(final vaule) 

我想保持第一组值不仅没有经过临时的连续值之间的.......... N_MC时间值。

我不知道如何调用一个文件,并删除特定的部分,我不想再保存它。

NB

欲仅传送第一组值0-3,0-9的,阵列(I,J)

 0   0 -1.0000000000000000  
     0   1 -1.0000000000000000  
     0   2 -1.0000000000000000  
     0   3 1.0000000000000000  
     0   4 1.0000000000000000   
     1   0 -1.0000000000000000  
     1   1 1.0000000000000000  
     1   2 1.0000000000000000  
     1   3 -1.0000000000000000  
     1   4 -1.0000000000000000   
     2   0 -1.0000000000000000  
     2   1 1.0000000000000000  
     2   2 -1.0000000000000000  
     2   3 1.0000000000000000  
     2   4 1.0000000000000000   
     3   0 -1.0000000000000000  
     3   1 -1.0000000000000000  
     3   2 1.0000000000000000  
     3   3 -1.0000000000000000  
     3   4 -1.0000000000000000 
     ! Not after that for Temp = 0.6999999999990 

到单个温度的文件。

+0

它不清楚你想要保留什么,但无论如何作为一个通用原则(不管语言)从文件中删除某些内容来重写整个文件,省略你想要删除的内容。对于这个例子,我怀疑你最好的办法是简单地在内存中保存你需要的内容,并且每次都重写整个文件。 – agentp 2014-11-04 13:28:12

+0

@george文件非常大。 – 2014-11-04 13:38:00

+0

如果你在一个类似Linux的平台上熟悉诸如'grep','split','cut'等实用工具,它们都可以用来获取文件中的位。如果你在类似Windows的平台上查找本地等价物。 – 2014-11-04 14:19:56

回答

0

当您关闭并重新打开一个现有的Fortran文件时,您可以说哪里定位第一次写入。

open(unit, action='write', position='append') 

末追加新的写操作,而

open(unit, action='write', position='rewind', status='replace') 

将清除现有内容并从头开始写。

+0

你好,欢迎在这个网站上。请务必阅读帮助,并熟悉常见的答案和格式功能。我会在你的第一篇文章中做一些基本的格式化,但在我看来,似乎还不清楚这应该如何解决问题。 – 2014-11-04 21:20:01

0

在我的理解,你知道你想要的到底有多少线,以保持(N_MC*N*M?),为了让您可以使用我们的答案起见,我们假设你想保持

KeepLines=N_MC*N*M 

你可以做什么,然后呼吁有以下开放式的语句读取语句,并马上写声明:

open (file="/path/yourBigFile", unit=13, access="sequential", status="old", action="read") 
open(unit=12, file="/path/yourSmallerFile", status="new", position="append", action="write") 
do i=0,KeepLines-1 !!Watch out for indexes here and be sure to have defined xx,yy, arr 
    read(13,*) xx,yy,arr 
    write(12,*) xx,yy,arr 
enddo 

如果你需要的不仅是第一个块,但所有不同的块这种做法是很容易普及:只是把温度一做循环两位开放的政治家之间并为你的较小文件的名称创建一个数组,以便在第二个公开声明中可以说类似file=name(temp)