【问题标题】:I want to edit my fortran generated file in fortran我想在 fortran 中编辑我的 fortran 生成文件
【发布时间】:2014-12-31 05:40:47
【问题描述】:

我有一个 fortran 95 程序,它以这种形式写入一个数组:

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 乘以 temp 的连续值之间的值。

我不知道如何调用文件并删除我不想要的特定部分并再次保存。

注意

我只想传输第一组值 0-3, 0-9, array(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

单个温度的文件。

【问题讨论】:

  • 不清楚您要保留什么,但无论如何作为一般原则(无论语言如何)从文件中删除某些内容,您重写整个文件,省略您要删除的内容。对于这个例子,我怀疑你最好的方法是简单地把你需要的东西保存在内存中,每次都重新写入整个文件。
  • @george 文件非常大。
  • 如果您使用的是类似 Linux 的平台,请熟悉诸如 grepsplitcut 之类的实用程序,它们都可用于从文件中获取位。如果您使用的是类似 Windows 的平台,请找出本地等价物。
  • 不是一个直接的答案,但是反转“do x”和“do y”循环可能会加快速度,因为您的代码将能够更直接地跟踪“数组”。当然,您必须记住,这会改变输出的顺序。

标签: linux file fortran editing fortran95


【解决方案1】:

据我了解,您确切知道要保留多少行(N_MC*N*M?),为了给出答案,您可以使用假设您要保留

KeepLines=N_MC*N*M

然后你可以做的是用下面的 open 语句调用一个 read 语句,然后立即调用一个 write 语句:

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

如果您不仅需要第一个块,还需要所有不同的块,这种方法很容易推广:只需在两个 open 语句之间的 temp 上放置一个 do-loop,并为较小文件的名称创建一个数组,以便在第二个开放声明,您可以说类似file=name(temp)

【讨论】:

    【解决方案2】:

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

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

    在末尾附加你的新写入,而

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

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

    【讨论】:

    • 您好,欢迎来到本站。请务必阅读帮助并熟悉通常的答案形式和格式功能。我会在你的第一篇文章中做一些基本的格式化,但在我看来仍然有点不清楚这应该如何解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-17
    • 2012-01-24
    相关资源
    最近更新 更多