在Fortran中跳过空行

时间:2013-10-01 11:06:54

标签: fortran

我正在使用fortran代码,我的输入文件看起来像这样:

...
Binning n:    4, "Si2-Events",  Event #:            12, Primary(s) weight  1.0000E+00
    Number of hit cells:           3
      488534  4.23038400E-05      489533  1.50734719E-04      489534  5.79968946E-05

   Binning n:    4, "Si2-Events",  Event #:            13, Primary(s) weight  1.0000E+00
    Number of hit cells:           2
      477500  3.04398331E-04      478500  1.13192732E-06

   Binning n:    4, "Si2-Events",  Event #:            14, Primary(s) weight  1.0000E+00
    Number of hit cells:           2
      512496  1.32522946E-05      513496  2.86743394E-04

   Binning n:    4, "Si2-Events",  Event #:            15, Primary(s) weight  1.0000E+00
    Number of hit cells:           2
      476539  1.95245666E-04      476540  2.37216373E-05

   Binning n:    4, "Si2-Events",  Event #:            16, Primary(s) weight  1.0000E+00
    Number of hit cells:           9
      502533  1.26090490E-05      502534  1.00212252E-04      503527  3.07000097E-04      503528  9.53662311E-06      503529  9.42530642E-06      503530  1.07992764E-05      503531  1.26466557E-05      503532  1.68176994E-05      503533  1.18242851E-05
...

换句话说,我有一个包含许多行的文件,每行显示第三行中的单元格编号和能量,例如

488534  4.23038400E-05      489533  1.50734719E-04      489534  5.79968946E-05

我想编写一个只读取此行的fortran代码,并将两个列中的单元格数和能量写入输出文件,如

Line             1                    

Cells   488534
        489533
        489534

Energy
 4.23038400E-05
 1.50734719E-04
 5.79968946E-05


Line 2 

Cells     477500  
          478500  

Energy  3.04398331E-04
         1.13192732E-06


etc...

问题是细胞数量因线而异。 如何在读取所有值后跳到下一行?

以下是我测试过的一些代码:

open (unit=7, file="Si1.txt", action="read", access="sequential")


open (unit=8, file="output.txt", action="write")

do i = 1, 900


    read (7,*) line1
    read (7,*) line2
    read (7,*) cell1, energy1, cell2, energy2
    write(8,*) "Run = ", i, "and cells = ", cell1, cell2, "and energy = ", energy1, energy2
end do

问题是只有在该行中有两个或更多值时才会起作用,而如果它少于两个则不行。

我有点失落(可能还有一个菜鸟),但有关如何使这项工作的任何建议?

1 个答案:

答案 0 :(得分:3)

您当前忽略了每个块的第二行上的有用信息,在块的第3行上找到的单元编号/能量对的数量。所以获取这些信息。

替换

read(7,*) line2

通过诸如

之类的陈述
 read(7,'(a32,i)') words, num_cells

我写'喜欢'是因为我没有计算要读入words变量(你将声明为character(len=32) :: words或类似的变量)中有多少个字符,你将不得不这样做这对你自己。执行此语句后,整数变量num_cells将具有要从下一行读取的单元对数。替换你的

read (7,*) cell1, energy1, cell2, energy2

do ix = 1, num_cells
   read (7,fmt=*, advance='no') cell(ix), energy(ix)
end do
read (7, '()', advance = ’yes’)

advance=no参数告诉处理器在读取单元/能量对后不要移动到输入文件中的下一行。另一方面,循环结束处的行告诉处理器移动到下一行。

显然(?)我没有给你写完整的解决方案,但你应该能够完全接受它。我没有为你测试过这个,所以语法可能会有一些小错误。