Fortran 95特别节目只是阅读和写作

时间:2014-01-26 20:57:08

标签: file-io fortran fortran95

我尝试用fortran 95编写一个程序来读取文件。该文件是在软件计算后创建的。从这个文件中读取相关信息后,我想写另一个文本文件。我有这样的文件;

 Model_disp

 Analysis type         NONLIN
 Step nr.              10    
 Load factor           1.000E+00 
 Result                DISPLA TOTAL  TRANSL
 Axes                  GLOBAL

 Nodnr       TDtX       TDtY       TDtZ  
   301   -7.359E-03 -7.205E-02  2.207E-02



 Analysis type         NONLIN
 Step nr.              27    
 Time                  3.400E-02 
 Result                DISPLA TOTAL  TRANSL
 Axes                  GLOBAL

 Nodnr       TDtX       TDtY       TDtZ  
   301   -7.356E-03 -7.202E-02  2.207E-02



 Analysis type         NONLIN
 Step nr.              44    
 Time                  6.800E-02 
 Result                DISPLA TOTAL  TRANSL
 Axes                  GLOBAL

 Nodnr       TDtX       TDtY       TDtZ  
   301   -7.362E-03 -7.202E-02  2.209E-02
..............
..............
..............

 Analysis type         NONLIN
 Step nr.              17010    
 Time                  3.400E+01 
 Result                DISPLA TOTAL  TRANSL
 Axes                  GLOBAL

 Nodnr       TDtX       TDtY       TDtZ  
   301   -2.726E-01 -6.948E+00  3.902E+00

我想读取Time,TDtx和TDtz之后我想将这些参数写入另一个.txt文件。这个文件总共有11014行。

我想用fortran编写的程序就是那个;

PROGRAM reading
IMPLICIT NONE

REAL :: Time, TDtx, TDtz


OPEN(1, FILE='Model_disp.txt', &
        STATUS='OLD', ACTION='READ'

READ(1,*), Time, TDtx, TDtz
PRINT*, Time, TDtx, TDtz

OPEN(2, FILE='disp.txt', STATUS='NEW', ACTION='WRITE')
  WRITE(2,*), Time, TDtx, TDtz

END PROGRAM

不幸的是,我失败了。我不知道我的错误在哪里。 你想帮助我吗?

2 个答案:

答案 0 :(得分:0)

如果您只想阅读给定格式的输入文件,提取并将其写入另一个文本文件,脚本语言(Python,Perl等)将更好地满足您的需求。

答案 1 :(得分:0)

假设您要解析文件,则需要执行比read语句更多的操作。做出以下假设:

  • 在以“时间”开头的行上有变量time;
  • 在一个开头“Nodnr”之后的一行是您的变量TDtxTDtx;
  • 线条是合适的。

你可以做一些事情(使用适当的声明,open等):

do
  read(unit_in, '(A)', iostat=iostat) line
  if (iostat.ne.0) exit
  if (line(1:4).eq.'Time') then
    read (line(5:), fmt1) time
    cycle
  end if
  if (line(1:5).eq.'Nodnr') then
    read (unit_in, fmt2) junk1, tdtx, junk2, tdtz
    write (unit_out, *) time, tdtx, tdtz
  end if
end do

其中fmt1fmt2是所需的格式。

示例文件建议首先使用“Nodnr”,如果是,则可以使用适当的更改来处理;我假设您的示例代码首先会读取time

当然,还有很多其他工作要做,例如检查条件。根据您的确切情况,您可以使这更简单,或者可能需要更加通用。

最后,如果您只是进行文本处理而输入文件非常不可靠,则其他工具可能会更好(但不是必需的)。