我正在使用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
问题是只有在该行中有两个或更多值时才会起作用,而如果它少于两个则不行。
我有点失落(可能还有一个菜鸟),但有关如何使这项工作的任何建议?
答案 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
参数告诉处理器在读取单元/能量对后不要移动到输入文件中的下一行。另一方面,循环结束处的行告诉处理器移动到下一行。
显然(?)我没有给你写完整的解决方案,但你应该能够完全接受它。我没有为你测试过这个,所以语法可能会有一些小错误。