Fortran - 文件输入输出

  • 简述

    Fortran 允许您从文件中读取数据并将数据写入文件。
    在上一章中,您已经了解了如何从终端读取数据以及将数据写入终端。在本章中,您将学习 Fortran 提供的文件输入和输出功能。
    您可以读取和写入一个或多个文件。OPEN、WRITE、READ 和 CLOSE 语句允许您实现这一点。
  • 打开和关闭文件

    在使用文件之前,您必须打开该文件。这open命令用于打开文件进行读取或写入。命令的最简单形式是 -
    
    open (unit = number, file = "name").
    
    但是,开放式声明可能具有一般形式 -
    
    open (list-of-specifiers)
    
    下表描述了最常用的说明符 -
    序号 说明符和说明
    1
    [UNIT=] u
    单元号 u 可以是 9-99 范围内的任何数字,它表示文件,你可以选择任何数字,但程序中每个打开的文件必须有一个唯一的数字
    2
    IOSTAT= ios
    它是 I/O 状态标识符,应该是一个整数变量。如果 open 语句成功,则返回的 ios 值为零,否则为非零值。
    3
    ERR = err
    它是一个标签,在出现任何错误时控件会跳转到该标签。
    4
    FILE = fname
    文件名,字符串。
    5
    STATUS = sta
    它显示文件的先前状态。一个字符串,可以具有 NEW、OLD 或 SCRATCH 三个值之一。关闭或程序结束时会创建和删除临时文件。
    6
    ACCESS = acc
    它是文件访问模式。可以有两个值中的任何一个,SEQUENTIAL 或 DIRECT。默认值为连续。
    7
    FORM = frm
    它给出了文件的格式化状态。可以有 FORMATTED 或 UNFORMATTED 两个值中的任何一个。默认为未格式化
    8
    RECL = rl
    它指定直接访问文件中每条记录的长度。
    打开文件后,可以通过 read 和 write 语句访问它。完成后,应使用close陈述。
    close 语句具有以下语法 -
    
    close ([UNIT = ]u[,IOSTAT = ios,ERR = err,STATUS = sta])
    
    请注意,括号中的参数是可选的。
    Example
    此示例演示打开一个新文件以将一些数据写入文件。
    
    program outputdata   
    implicit none
       real, dimension(100) :: x, y  
       real, dimension(100) :: p, q
       integer :: i  
       
       ! data  
       do i=1,100  
          x(i) = i * 0.1 
          y(i) = sin(x(i)) * (1-cos(x(i)/3.0))  
       end do  
       
       ! output data into a file 
       open(1, file = 'data1.dat', status = 'new')  
       do i=1,100  
          write(1,*) x(i), y(i)   
       end do  
       
       close(1) 
       
    end program outputdata
    
    当上面的代码编译并执行时,它会创建文件 data1.dat 并将 x 和 y 数组值写入其中。然后关闭文件。

    读取和写入文件

    read 和 write 语句分别用于读取和写入文件。
    它们具有以下语法 -
    
    read ([UNIT = ]u, [FMT = ]fmt, IOSTAT = ios, ERR = err, END = s)
    write([UNIT = ]u, [FMT = ]fmt, IOSTAT = ios, ERR = err, END = s)
    
    大多数说明符已经在上表中讨论过。
    END = s 说明符是程序在到达文件结尾时跳转的语句标签。
    Example
    此示例演示了读取和写入文件。
    在这个程序中,我们从文件中读取,我们在上一个示例中创建了 data1.dat,并将其显示在屏幕上。
    
    program outputdata   
    implicit none   
       real, dimension(100) :: x, y  
       real, dimension(100) :: p, q
       integer :: i  
       
       ! data  
       do i = 1,100  
          x(i) = i * 0.1 
          y(i) = sin(x(i)) * (1-cos(x(i)/3.0))  
       end do  
       
       ! output data into a file 
       open(1, file = 'data1.dat', status='new')  
       do i = 1,100  
          write(1,*) x(i), y(i)   
       end do  
       close(1) 
       ! opening the file for reading
       open (2, file = 'data1.dat', status = 'old')
       do i = 1,100  
          read(2,*) p(i), q(i)
       end do 
       
       close(2)
       
       do i = 1,100  
          write(*,*) p(i), q(i)
       end do 
       
    end program outputdata
    
    编译并执行上述代码时,会产生以下结果 -
    
    0.100000001  5.54589933E-05
    0.200000003  4.41325130E-04
    0.300000012  1.47636665E-03
    0.400000006  3.45637114E-03
    0.500000000  6.64328877E-03
    0.600000024  1.12552457E-02
    0.699999988  1.74576249E-02
    0.800000012  2.53552198E-02
    0.900000036  3.49861123E-02
    1.00000000   4.63171229E-02
    1.10000002   5.92407547E-02
    1.20000005   7.35742599E-02
    1.30000007   8.90605897E-02
    1.39999998   0.105371222    
    1.50000000   0.122110792    
    1.60000002   0.138823599    
    1.70000005   0.155002072    
    1.80000007   0.170096487    
    1.89999998   0.183526158    
    2.00000000   0.194692180    
    2.10000014   0.202990443    
    2.20000005   0.207826138    
    2.29999995   0.208628103    
    2.40000010   0.204863414    
    2.50000000   0.196052119    
    2.60000014   0.181780845    
    2.70000005   0.161716297    
    2.79999995   0.135617107    
    2.90000010   0.103344671    
    3.00000000   6.48725405E-02
    3.10000014   2.02930309E-02
    3.20000005  -3.01767997E-02
    3.29999995  -8.61928314E-02
    3.40000010  -0.147283033    
    3.50000000  -0.212848678    
    3.60000014  -0.282169819    
    3.70000005  -0.354410470    
    3.79999995  -0.428629100    
    3.90000010  -0.503789663    
    4.00000000  -0.578774154    
    4.09999990  -0.652400017    
    4.20000029  -0.723436713    
    4.30000019  -0.790623367    
    4.40000010  -0.852691114    
    4.50000000  -0.908382416    
    4.59999990  -0.956472993    
    4.70000029  -0.995793998    
    4.80000019  -1.02525222    
    4.90000010  -1.04385209    
    5.00000000  -1.05071592    
    5.09999990  -1.04510069    
    5.20000029  -1.02641726    
    5.30000019  -0.994243503    
    5.40000010  -0.948338211    
    5.50000000  -0.888650239    
    5.59999990  -0.815326691    
    5.70000029  -0.728716135    
    5.80000019  -0.629372001    
    5.90000010  -0.518047631    
    6.00000000  -0.395693362    
    6.09999990  -0.263447165    
    6.20000029  -0.122622721    
    6.30000019   2.53026206E-02
    6.40000010   0.178709000    
    6.50000000   0.335851669    
    6.59999990   0.494883657    
    6.70000029   0.653881252    
    6.80000019   0.810866773    
    6.90000010   0.963840425    
    7.00000000   1.11080539    
    7.09999990   1.24979746    
    7.20000029   1.37891412    
    7.30000019   1.49633956    
    7.40000010   1.60037732    
    7.50000000   1.68947268    
    7.59999990   1.76223695    
    7.70000029   1.81747139    
    7.80000019   1.85418403    
    7.90000010   1.87160957    
    8.00000000   1.86922085    
    8.10000038   1.84674001    
    8.19999981   1.80414569    
    8.30000019   1.74167395    
    8.40000057   1.65982044    
    8.50000000   1.55933595    
    8.60000038   1.44121361    
    8.69999981   1.30668485    
    8.80000019   1.15719533    
    8.90000057   0.994394958    
    9.00000000   0.820112705    
    9.10000038   0.636327863    
    9.19999981   0.445154816    
    9.30000019   0.248800844    
    9.40000057   4.95488606E-02
    9.50000000  -0.150278628    
    9.60000038  -0.348357052    
    9.69999981  -0.542378068    
    9.80000019  -0.730095863    
    9.90000057  -0.909344316    
    10.0000000  -1.07807255