我需要在Fortran 90中将一些数据写入文件。我应该如何使用WRITE (*,*) input
将值分组到列? <{1}}在每次通话后总是放WRITE
,这就是问题所在。
代码示例:
new line
现在重点是将它写在不同的列中。
答案 0 :(得分:12)
您可以使用隐含的DO循环将值写为单个记录。比较以下两个例子:
integer :: i
do i=1,10
write(*,'(2I4)') i, 2*i
end do
它产生:
1 2
2 4
3 6
...
使用隐含的DO循环,它可以重写为:
integer :: i
write(*, '(10(2I4))') (i, 2*i, i=1,10)
这个产生:
1 2 2 4 3 6 ...
如果在编译时未修复元素数量,您可以使用<n>
扩展名(gfortran
不支持):
write(*, '(<n>(2I4))') (i, 2*i, i=1,n)
从变量(2I4)
的值中获取n
编辑描述符的重复次数。在GNU Fortran中,您可以首先使用内部文件创建适当的编辑描述符:
character(len=20) :: myfmt
write(myfmt, '("(",I0,"(2I4))")') n
write(*, fmt=myfmt) (i, 2*i, i=1,n)
当然,它也适用于列表定向输出(输出格式为*
):
write(*, *) (i, 2*i, i=1,10)
答案 1 :(得分:4)
这实际上取决于您尝试写入文件的数据(即,您是否在循环或数组中有标量...)。你能在问题中加入对此的描述吗?
如果您尝试多次向同一行写入标量,请尝试使用非前进I / O ,将关键字参数advance="no"
传递给write语句,例如< / p>
integer :: x
do x = 1,10
write(*, fmt='(i4,1x)', advance="no") x
end do
但是,要注意non-advancing I/O的惊喜。
答案 2 :(得分:0)
答案取决于你回答克里斯的问题。如果你想要一行,那么你将不得不使用Chris所描述的非推进IO。如果没有这个,使用多个格式化的write语句,您将始终获得多行。
此外,您可能需要使用格式化IO而不是list-directed(*)IO。对于列表导向的IO,规则是松散的。不同的编译器可能产生不同的输出。对于许多输出项,换行可能会使输出线保持太长时间。
如果所有变量都是实数,那么这种格式应该有效:
write (4, '( *(2X, ES14.6) )', advance="no" )
答案 3 :(得分:0)
好的旧$ edit描述符怎么样:
write(*, fmt='(i4,$)') x
记得在你的循环之后做一个写(*,*)...