如何从fortran文件中读取数据

时间:2019-04-25 08:14:03

标签: fortran

我有一个.dat文件,其中包含许多行中的一系列数据,如下所示。我想从每一行读取两个数字(第二个和第三个数字)并将其分配给变量,这样 第2到x(1,i)和第3到x(2,i)。 i的值从1更改为9000,分别对应于每行9000行。

  1   0.2077742E-01   0.1315710E-01   0.2218703E-04  -0.7526844E-05
  2   0.2064923E-01   0.1370921E-01   0.5160497E-05  -0.6106872E-04
  3   0.2069335E-01   0.1446493E-01  -0.1517477E-04  -0.2678836E-04
  4   0.2136012E-01   0.1310226E-01   0.8096579E-04  -0.2091828E-04
  5   0.2129221E-01   0.1380866E-01   0.9713367E-05  -0.2111076E-04
  6   0.2130786E-01   0.1449554E-01  -0.1372658E-05  -0.1607569E-05
  7   0.2195375E-01   0.1304382E-01   0.1206853E-03  -0.2769564E-04
  8   0.2171398E-01   0.1372358E-01  -0.1436741E-04  -0.2231794E-04
  9   0.2193212E-01   0.1446982E-01  -0.5678712E-05  -0.1880452E-04
 10   0.2255034E-01   0.1298457E-01   0.2226397E-03  -0.4775016E-04
 11   0.2234811E-01   0.1370892E-01   0.1539219E-04  -0.2676827E-04
 12   0.2250139E-01   0.1449063E-01   0.6857453E-05  -0.1959816E-04
 13   0.2311584E-01   0.1292939E-01   0.3245234E-03  -0.2145422E-04
 14   0.2265567E-01   0.1367124E-01  -0.5482677E-04  -0.6929516E-04
 15   0.2308732E-01   0.1441105E-01  -0.4883980E-04  -0.5488964E-04
 16   0.2369612E-01   0.1286988E-01   0.3164438E-03   0.5181705E-05
 17   0.2333626E-01   0.1358709E-01   0.2992323E-04  -0.3658970E-04
 18   0.2351967E-01   0.1444346E-01   0.2000859E-04   0.5844122E-05
 19   0.2425562E-01   0.1280576E-01   0.1712960E-03   0.3221714E-04
 20   0.2358314E-01   0.1359597E-01  -0.5286794E-04   0.5639317E-04
 21   0.2406372E-01   0.1434354E-01  -0.3155423E-04   0.2389453E-04
 22   0.2440915E-01   0.1444667E-01   0.9195025E-04   0.2545742E-04
 23   0.2484257E-01   0.1274295E-01   0.6371955E-04   0.1572621E-04
 24   0.2444211E-01   0.1359181E-01  -0.1755666E-03   0.1667949E-03
 25   0.2431473E-01   0.1346151E-01   0.1424003E-03  -0.1036167E-03
 26   0.2498710E-01   0.1434537E-01   0.3143868E-04  -0.4613371E-05
 27   0.2542195E-01   0.1267686E-01  -0.1103745E-04  -0.3899099E-05
 28   0.2527807E-01   0.1340544E-01  -0.1526311E-03  -0.1358241E-04
 29   0.2519788E-01   0.1350556E-01   0.1004352E-03   0.6685333E-04
 30   0.2528750E-01   0.1443648E-01   0.1048803E-03   0.2594530E-04
 31   0.2605581E-01   0.1262580E-01   0.3114293E-04   0.5790992E-05
 32   0.2602784E-01   0.1324524E-01  -0.6518681E-05  -0.1118536E-03
 33   0.2583167E-01   0.1405316E-01  -0.9194989E-05   0.5246043E-04
 34   0.2599337E-01   0.1449096E-01   0.1606246E-03   0.2065522E-04
 35   0.2665012E-01   0.1256468E-01   0.4131713E-04   0.8817949E-05
 36   0.2623754E-01   0.1339113E-01  -0.1785680E-03   0.1278207E-03

我写了下面的代码,但是没有达到我的期望。

我不知道该代码各部分的含义,例如STATUS ='OLD',即读命令中的*。我只是遵循了一些教程,并尝试类似地编码。如果可能的话,也请向他们解释,或请我阅读一本好,简单而全面的书或教程。

implicit none
integer:: i,a
real(8):: x(2,9000)

open (2, file="f_xv0950.dat",STATUS='OLD')
    do i=1,9000
        read (2,*) a, x(1,i), x(2,i)
   enddo
close(2)

我期望的结果应该看起来像

x(1,1) = 0.2077742E-01    x(2,1) = 0.1315710E-01
x(1,2) = 0.2064923E-01    x(2,2) = 0.1370921E-01
x(1,3) = 0.2069335E-01    x(2,3) = 0.1446493E-01

以此类推。...

非常感谢您的帮助。谢谢。

!!!!!!!!!!!!编辑_1 !!!!!!!!!!! 添加了以下几行,以使用以下代码将输出写入文件:

open (3,file="tempout.dat") 
    do i=1,9000
         write (2,100) x(1,i), x(2,i) 
    enddo 
100   format(2(2x, e14.7)) 
close (3) 

但是我得到一个错误

forrtl: severe (24): end-of-file during read, unit 2, file C:\Users\mkha0038\Desktop\XDSPH_RMC_T\f_xv0950.dat

可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

您撰写的内容几乎可以使用。除了缺少结尾,您还需要显式声明变量x,以便将其标注为数组。这是一个与36行截断的示例文件一起使用的示例:

program readin

  real, dimension(2,36) :: x
  integer :: i

  open (2, file="f_xv0950.dat",STATUS='OLD')
  do i=1,36
     read (2,*) a, x(1,i), x(2,i)
  end do
  close(2)

  do i=1,3
     write(6,'(a,i1,a,e13.7,a,i1,a,e13.7)') "x(1,",i,") = ",x(1,i), &
          " x(2,",i,") = ",x(2,i)
  end do

end program readin

它给出的输出

x(1,1) = 0.2077742E-01 x(2,1) = 0.1315710E-01
x(1,2) = 0.2064923E-01 x(2,2) = 0.1370921E-01
x(1,3) = 0.2069335E-01 x(2,3) = 0.1446493E-01

如您所愿