在Fortran中写出数组时控制换行符

时间:2018-07-26 08:23:55

标签: 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的“一次性编写数组”方面,但这似乎行得通。

但是,它以这种方式写出数组中的数字(例如,一月份为示例,因此为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。

1 个答案:

答案 0 :(得分:3)

您可能想要类似的东西

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

说明:

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

此外,

  • 可以使用/控件编辑描述符添加新行;例如,如果您要打印每行10个值的数据,则可以

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

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

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