Fortran 文件输入输出

Fortran 让您可以从文件读取数据和向文件写入数据。

在上一章中,您已经了解了如何从终端读取数据和向终端写入数据。在本章中,您将学习 Fortran 提供的文件输入和输出功能。

您可以对一个或多个文件进行读写操作。OPENWRITEREADCLOSE 语句让您可以实现这一点。

打开和关闭文件

在使用文件之前,您必须打开该文件。open 命令用于打开文件进行读取或写入。命令的最简单形式是:

  1. open (unit = number, file = "name").

然而,公开声明可能具有一般形式:

  1. open (list-of-specifiers)

下表描述了最常用的说明符:

序号说明符 & 描述
1

[UNIT=] u

u 可以是 9-99 范围内的任何数字,它表示文件,您可以选择任何数字,但程序中的每个打开的文件都必须有一个唯一的数字

2

IOSTAT= ios

它是 I/O 状态标识符,应该是一个整数变量。如果 open 语句成功,则返回的 ios 值为 0,否则为非零值。

3

ERR = err

这是一个标签,如果出现任何错误,控件将跳转到该标签。

4

FILE = fname

文件名,字符串。

5

STATUS = sta

它显示了文件的先前状态。一个字符串,可以有 3 个值之一 NEWOLDSCRATCH。当关闭或程序结束时,会创建并删除一个草稿文件。

6

ACCESS = acc

这是文件访问模式。可以有两个值中的任何一个,SEQUENTIALDIRECT。默认设置为 SEQUENTIAL

7

FORM = frm

它给出了文件的格式状态。可以有 FORMATTEDUNFORMATED 两个值中的任何一个。默认设置为 UNFORMATTED

8

RECL = rl

它指定了直接访问文件中每条记录的长度。

打开文件后,可以通过读写语句访问它。一旦完成,应使用 close 语句将其关闭。

close 语句具有以下语法:

  1. close ([UNIT = ]u[,IOSTAT = ios,ERR = err,STATUS = sta])

请注意,括号中的参数是可选的。

实例

此实例演示如何打开一个新文件,以便将一些数据写入该文件。

  1. program outputdata
  2. implicit none
  3. real, dimension(100) :: x, y
  4. real, dimension(100) :: p, q
  5. integer :: i
  6. ! data
  7. do i=1,100
  8. x(i) = i * 0.1
  9. y(i) = sin(x(i)) * (1-cos(x(i)/3.0))
  10. end do
  11. ! output data into a file
  12. open(1, file = 'data1.dat', status = 'new')
  13. do i=1,100
  14. write(1,*) x(i), y(i)
  15. end do
  16. close(1)
  17. end program outputdata

当上述代码被编译和执行时,它会创建文件 data1.dat,并将 xy 数组值写入其中。然后关闭该文件。


读取和写入文件

readwrite 语句分别用于从文件中读取和写入文件。

它们具有以下语法:

  1. read ([UNIT = ]u, [FMT = ]fmt, IOSTAT = ios, ERR = err, END = s)
  2. write([UNIT = ]u, [FMT = ]fmt, IOSTAT = ios, ERR = err, END = s)

上表已经讨论了大多数说明符。

END = s 说明符是一个语句标签,当程序到达文件末尾时,它会跳到这里

实例

此实例演示了从文件读取和向文件写入。

在这个程序中,我们从上一个示例中创建的文件 data1.dat 中读取数据,并将其显示在屏幕上。

  1. program outputdata
  2. implicit none
  3. real, dimension(100) :: x, y
  4. real, dimension(100) :: p, q
  5. integer :: i
  6. ! data
  7. do i = 1,100
  8. x(i) = i * 0.1
  9. y(i) = sin(x(i)) * (1-cos(x(i)/3.0))
  10. end do
  11. ! output data into a file
  12. open(1, file = 'data1.dat', status='new')
  13. do i = 1,100
  14. write(1,*) x(i), y(i)
  15. end do
  16. close(1)
  17. ! opening the file for reading
  18. open (2, file = 'data1.dat', status = 'old')
  19. do i = 1,100
  20. read(2,*) p(i), q(i)
  21. end do
  22. close(2)
  23. do i = 1,100
  24. write(*,*) p(i), q(i)
  25. end do
  26. end program outputdata

结果如下:

  1. 0.100000001 5.54589933E-05
  2. 0.200000003 4.41325130E-04
  3. 0.300000012 1.47636665E-03
  4. 0.400000006 3.45637114E-03
  5. 0.500000000 6.64328877E-03
  6. 0.600000024 1.12552457E-02
  7. 0.699999988 1.74576249E-02
  8. 0.800000012 2.53552198E-02
  9. 0.900000036 3.49861123E-02
  10. 1.00000000 4.63171229E-02
  11. 1.10000002 5.92407547E-02
  12. 1.20000005 7.35742599E-02
  13. 1.30000007 8.90605897E-02
  14. 1.39999998 0.105371222
  15. 1.50000000 0.122110792
  16. 1.60000002 0.138823599
  17. 1.70000005 0.155002072
  18. 1.80000007 0.170096487
  19. 1.89999998 0.183526158
  20. 2.00000000 0.194692180
  21. 2.10000014 0.202990443
  22. 2.20000005 0.207826138
  23. 2.29999995 0.208628103
  24. 2.40000010 0.204863414
  25. 2.50000000 0.196052119
  26. 2.60000014 0.181780845
  27. 2.70000005 0.161716297
  28. 2.79999995 0.135617107
  29. 2.90000010 0.103344671
  30. 3.00000000 6.48725405E-02
  31. 3.10000014 2.02930309E-02
  32. 3.20000005 -3.01767997E-02
  33. 3.29999995 -8.61928314E-02
  34. 3.40000010 -0.147283033
  35. 3.50000000 -0.212848678
  36. 3.60000014 -0.282169819
  37. 3.70000005 -0.354410470
  38. 3.79999995 -0.428629100
  39. 3.90000010 -0.503789663
  40. 4.00000000 -0.578774154
  41. 4.09999990 -0.652400017
  42. 4.20000029 -0.723436713
  43. 4.30000019 -0.790623367
  44. 4.40000010 -0.852691114
  45. 4.50000000 -0.908382416
  46. 4.59999990 -0.956472993
  47. 4.70000029 -0.995793998
  48. 4.80000019 -1.02525222
  49. 4.90000010 -1.04385209
  50. 5.00000000 -1.05071592
  51. 5.09999990 -1.04510069
  52. 5.20000029 -1.02641726
  53. 5.30000019 -0.994243503
  54. 5.40000010 -0.948338211
  55. 5.50000000 -0.888650239
  56. 5.59999990 -0.815326691
  57. 5.70000029 -0.728716135
  58. 5.80000019 -0.629372001
  59. 5.90000010 -0.518047631
  60. 6.00000000 -0.395693362
  61. 6.09999990 -0.263447165
  62. 6.20000029 -0.122622721
  63. 6.30000019 2.53026206E-02
  64. 6.40000010 0.178709000
  65. 6.50000000 0.335851669
  66. 6.59999990 0.494883657
  67. 6.70000029 0.653881252
  68. 6.80000019 0.810866773
  69. 6.90000010 0.963840425
  70. 7.00000000 1.11080539
  71. 7.09999990 1.24979746
  72. 7.20000029 1.37891412
  73. 7.30000019 1.49633956
  74. 7.40000010 1.60037732
  75. 7.50000000 1.68947268
  76. 7.59999990 1.76223695
  77. 7.70000029 1.81747139
  78. 7.80000019 1.85418403
  79. 7.90000010 1.87160957
  80. 8.00000000 1.86922085
  81. 8.10000038 1.84674001
  82. 8.19999981 1.80414569
  83. 8.30000019 1.74167395
  84. 8.40000057 1.65982044
  85. 8.50000000 1.55933595
  86. 8.60000038 1.44121361
  87. 8.69999981 1.30668485
  88. 8.80000019 1.15719533
  89. 8.90000057 0.994394958
  90. 9.00000000 0.820112705
  91. 9.10000038 0.636327863
  92. 9.19999981 0.445154816
  93. 9.30000019 0.248800844
  94. 9.40000057 4.95488606E-02
  95. 9.50000000 -0.150278628
  96. 9.60000038 -0.348357052
  97. 9.69999981 -0.542378068
  98. 9.80000019 -0.730095863
  99. 9.90000057 -0.909344316
  100. 10.0000000 -1.07807255

分类导航