首页 > 解决方案 > 在 Fortran 中写出数组时控制换行符

问题描述

所以我有一些代码基本上可以做到这一点:

REAL, DIMENSION(31) :: month_data
INTEGER :: no_days
no_days = get_no_days()
month_data = [fill array with some values]
WRITE(1000,*) (month_data(d), d=1,no_days)

所以我有一个包含每个月值的数组,在一个循环中,我根据该月有多少天用一定数量的值填充数组,然后将结果写到文件中。

我花了相当长的时间来理解 WRITE 的整个“一次性写出一个数组”方面,但这似乎有效。

然而,通过这种方式,它会像这样写出数组中的数字(例如 1 月,所以 31 个值):

  0.00000         10.0000         20.0000         30.0000         40.0000         50.0000         60.0000
  70.0000         80.0000         90.0000         100.000         110.000         120.000         130.000
  140.000         150.000         160.000         170.000         180.000         190.000         200.000
  210.000         220.000         230.000         240.000         250.000         260.000         270.000
  280.000         290.000         300.000

所以它前缀了很多空格(大概是为了让列对齐,即使数组中有更大的值),它会换行以使其不超过一定的宽度(我认为 128 个字符?不确定)。

我真的不介意额外的空间(尽管它们大大增加了我的文件大小,所以修复它也会很好......)但是分解线搞砸了我的其他工具。我已经尝试阅读几本 Fortran 手册,但是虽然其中一些提到了“输出格式”,但我还没有找到一个提到换行符或列的手册。

那么,在 Fortran 中使用上述语法时,如何控制数组的写出方式?

(另外,当我们在这里的时候,我如何控制小数位数的 nr?我知道这些都是整数值,所以我想把所有小数都省略掉,但我不能将数据类型更改为由于原因,我的代码中有 INTEGER)。

标签: fortran

解决方案


你可能想要类似的东西

WRITE(1000,'(31(F6.0,1X))') (month_data(d), d=1,no_days)

解释:

  • 作为格式规范的使用*称为列表定向 I/O:它很容易编码,但是您将对格式的所有控制权交给处理器。为了控制格式,您需要通过FORMAT语句的标签或字符变量来提供显式格式。
  • F对十进制形式的实变量使用编辑描述符。它们的语法是 F wd,其中w是字段的宽度,d是小数位数,包括小数点符号。 F6.0因此表示宽度为 6 个字符且没有小数位的字段。
  • 可以使用X控件编辑描述符添加空格。
  • 编辑描述符的重复可以用符号前的重复次数来表示。
  • 可以使用(...创建组),如果前面有多次重复,则可以重复它们。
  • 除了最后提供的变量之外,不再打印任何项目,即使格式指定如何打印比实际提供的项目更多的项目 - 因此31即使在几个月内您只会打印 30 或 28 天的数据,您也可以要求重复。

除了,

  • 可以使用/控件编辑描述符添加新行;例如,如果你想打印每行 10 个值的数据,你可以这样做

    WRITE(1000,'(4(10(F6.0,:,1X),/))') (month_data(d), d=1,no_days)
    
  • 请注意:第二个示例中的控件编辑描述符:它表明,如果没有更多要打印的项目,则不应打印任何其他内容 - 甚至与控件编辑描述符相对应的空格,例如Xor /。虽然它可以在前面的示例中使用,但在这里更相关,以确保如果no_days是 的倍数10,则在 3 行数据之后没有空行。

  • 如果要完全删除小数符号,则需要使用nint内在和 I w(整数)描述符打印最接近的整数:

    WRITE(1000,'(31(I6,1X))') (nint(month_data(d)), d=1,no_days)
    

推荐阅读