在Fortran中跳过空行

在Fortran中跳过空行,fortran,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 Binni

我正在使用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
问题是,只有当该行中有两个或更多的值时,这种方法才起作用,而当值小于两个时,这种方法就不起作用了


我有点不知所措(这里可能是一个noob),但有没有关于如何使这项工作正常进行的建议?

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

替换你的

read(7,*) line2
通过诸如

 read(7,'(a32,i)') words, num_cells
我之所以写“例如”,是因为我还没有计算要读入
words
变量(您将声明为
character(len=32)::words
或类似变量)的字符数,所以您必须自己完成。执行此语句后,整数变量
num_cells
将具有从下一行读取的单元格对数。替换你的

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

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

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

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