首页 文章

将数据写入列中的文件(Fortran)

提问于
浏览
6

我需要在Fortran 90中将一些数据写入文件 . 我应该如何使用 WRITE (*,*) input 将值分组在 columns 中? WRITE 总是在每次调用后放一个 new line ,这就是问题所在 .

代码示例:

open (unit = 4, file = 'generated_trajectories1.dat', form='formatted')

do time_nr=0, N
   write (4,*) dble(time_nr)*dt, initial_traj(time_nr)
end do

现在重点是将它写在不同的列中 .

4 回答

  • 0

    您可以使用隐含的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)
    

    它从变量 n 的值中获取 (2I4) 编辑描述符的重复次数 . 在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)
    
  • 10

    这实际上取决于您尝试写入文件的数据(即,您是否在循环或数组中有标量...) . 你能在问题中加入对此的描述吗?

    如果你试图多次向同一行写一个标量,那么尝试使用非前进的I / O,将关键字参数 advance="no" 传递给write语句,例如:

    integer :: x
    
    do x = 1,10
      write(*, fmt='(i4,1x)', advance="no") x
    end do
    

    但是,请注意non-advancing I/O的惊喜 .

  • 0

    答案取决于你回答克里斯的问题 . 如果你想要一行,那么你将不得不使用Chris所描述的非推进IO . 如果没有这个,使用多个格式化的write语句,您将始终获得多行 .

    此外,您可能需要使用格式化IO而不是list-directed(*)IO . 对于列表导向的IO,规则是松散的 . 不同的编译器可能产生不同的输出 . 对于许多输出项,换行可能会使输出线保持太长时间 .

    这里的格式应该适用于所有变量都是实数的:

    write (4, '( *(2X, ES14.6) )', advance="no" )
    
  • 4

    好旧的$ edit描述符怎么样:

    write(*, fmt='(i4,$)') x
    

    记得在你的循环之后做一个写()...

相关问题