在Fortran中跳过空行
我正在使用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
...
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’)