fortran - 在 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)。
解决方案
你可能想要类似的东西
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
or/
。虽然它可以在前面的示例中使用,但在这里更相关,以确保如果no_days
是 的倍数10
,则在 3 行数据之后没有空行。如果要完全删除小数符号,则需要使用
nint
内在和 I w(整数)描述符打印最接近的整数:WRITE(1000,'(31(I6,1X))') (nint(month_data(d)), d=1,no_days)
推荐阅读
- javascript - 如何使用 Google Maps Javascript 将位置和缩放级别转换为 LatLngBounds?
- python - 如何使用 Visual Studio 环境变量运行 Python 代码
- r - expss 包中的显着性测试行
- python - shareplum 仅从 SharePoint 列表返回 7 列
- c++ - C++ 从按顺序执行的其他 constexpr lambda 创建 lambda 不能是 constexpr
- firebase - 如何摆脱这个错误?错误:没有创建 Firebase 应用“[DEFAULT]” - 调用 firebase.initializeApp()
- laravel - laravel 将数据动态卡到 1 模态
- java - activemq - javax.jms.IllegalStateException:AMQ219019:会话已关闭
- javascript - Sequelize Many to Many - 更新关联表
- javascript - 创建不带参数的 JavaScript 函数并使用点传递数据