Formatting 为依赖于变量的输出设置字符串格式
我想要一个Fortran write语句的格式取决于某个变量。例如,我可以写:Formatting 为依赖于变量的输出设置字符串格式,formatting,fortran,fortran90,intel-fortran,Formatting,Fortran,Fortran90,Intel Fortran,我想要一个Fortran write语句的格式取决于某个变量。例如,我可以写: write(*,'(3f15.3,3f9.2)') x,y,z,(var(i),i=1,nvari) 其中nvari=3。但是,如果在某些情况下,我实际上有4个变量(即,nvari=4)。我想这样写: write(*,'(3f15.3,nvari(f9.2))') x,y,z,(var(i),i=1,nvari) write(*,'(3f15.3,nvari(f9.2))') x, y, z, (var(i),
write(*,'(3f15.3,3f9.2)') x,y,z,(var(i),i=1,nvari)
其中nvari=3
。但是,如果在某些情况下,我实际上有4个变量(即,nvari=4
)。我想这样写:
write(*,'(3f15.3,nvari(f9.2))') x,y,z,(var(i),i=1,nvari)
write(*,'(3f15.3,nvari(f9.2))') x, y, z, (var(i), i=1,nvari)
现在,
nvari
可以是任何东西,输出将按我喜欢的方式工作。我怎样才能使这样的东西工作?如果您的编译器支持它,'(3f15.3,*(f9.2))
如果您使用的是较旧的编译器,则只需使用比要输出的项更多的数字,例如,”(3f15.3999(f9.2))“
。你不必用尽格式
对于最复杂的情况,您可以将格式写入字符串并将其用作格式:
write (string, '( "(3f15.3, ", I4, "(f9.2))" )' ) nvari
write (*, string ) x,y,z, (array(i), i=1,nvari)
了解格式(包括格式反转)后,很少需要使用字符串格式。也可以使用字符变量,而不是直接在write语句中写入格式
character(len=32) :: my_fmt
my_fmt = '(3f15.3,3f9.2)'
write(*, my_fmt) x, y, z, (var(i), i = 1, nvari)
现在可以使用所谓的“内部写入”或“写入内部文件”操作字符变量,以在write语句之前包含所需的重复计数
write(my_fmt, '(a, i0, a)') '(3f15.3,', nvari, 'f9.2)'
(只需确保声明的my_fmt长度足以包含整个字符串即可。)如果您使用的是英特尔fortran,它为此提供了一个专有的扩展名--您可以在尖括号中包含一个现有变量作为说明符:
write(*,'(3f15.3,<nvari>f9.2)') x,y,z,(var(i),i=1,nvari)
write(*,”(3f15.3,f9.2)“x,y,z,(var(i),i=1,nvari)
您想写这样的东西:
write(*,'(3f15.3,nvari(f9.2))') x,y,z,(var(i),i=1,nvari)
write(*,'(3f15.3,nvari(f9.2))') x, y, z, (var(i), i=1,nvari)
事实上,Fortran标准中有一个老把戏,允许您省略nvari
,因此:
write(*,'(3f15.3,(f9.2))') x, y, z, (var(i), i=1,nvari)
甚至如此:
write(*,'(3f15.3,f9.2)') x, y, z, (var(i), i=1,nvari)
该标准规定,格式中的最后一个描述符会根据需要隐式重复,以容纳列表中的所有变量。该“最后一个描述符”可以插入括号,以便隐式重复最后一组描述符,例如:
write(*,'(3f15.3,(2x,f9.2))') x, y, z, (var(i), i=1,nvari)
3
和4
是唯一的选择吗?或者您正在寻找可以处理任何数字的东西?OP指定的“nvari可以是任何东西”。或者,在最后一条(括号)语句中,使用可分配的长度字符变量。@HighPerformanceMark:当然,如果您的编译器支持它,这将是最好的解决方案。对于使用gfortran编译器的人,此解决方案是gfortran文档中推荐的解决方案。请参阅文档中的“变量格式表达式”(第6.2.3节针对gfortran 4,第6.2.3节针对gfortran 5;第6.2.2节针对gfortran 6)。我警告不要写入字符串。Mac上的Gfortran对于写入字符串变量而言不是线程安全的。文件的I/O似乎是线程安全的,而不是字符串。酷。谢谢。我使用的是英特尔Fortran编译器,我认为它是最新的。但无论如何,它不执行“(3f15.3,*(f9.2)),所以我使用第二个解决方案。顺便问一下,你说的“格式转换”是什么意思?我在谷歌上搜索了一下,但没找到多少。哦,酷。谢谢你的回答。这正是我想要的。有没有办法在
上做一些数学运算?例如-+2
,或3*
或**2
在格式语句中?我用括号试了一下。。那不行!编辑:我现在使用的解决方法是定义另一个整数变量nfmt
,并使用它而不是nvari
是否有方法使用gfortran编译器使用a
样式格式?如果您来寻找解决方案,请参阅其他答案,这个答案在gfortran和其他一些编译器中不起作用。这帮助我认识到我的FORMAT语句是什么。但现在我必须切换编译器:(我使用的是gfortran9
。除非像第二个示例中那样使用括号,否则这对我来说不起作用。它还会在新行而不是在同一行上生成重复输出,这不是OP想要的。