代码之家  ›  专栏  ›  技术社区  ›  Roel

用Fortran编写数组时控制换行

  •  1
  • Roel  · 技术社区  · 6 年前

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

    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)
    

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

    我花了很长时间才把整个写作的“一次性写出一个数组”,但这似乎是可行的。

    但是这样,它会像这样写出数组中的数字(例如一月,所以是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?我知道这些都是整数值,所以我想省略所有小数,但由于种种原因,我无法在代码中将数据类型更改为整数。

    1 回复  |  直到 6 年前
        1
  •  4
  •   jme52    6 年前

    你可能想要类似的东西

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

    说明:

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

    另外,

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

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

    • 如果要完全删除十进制符号,则需要使用 nint 内在的和 西 (整数)描述符:

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