Запись данных в файл в Столбцах (Fortran)

мне нужно записать некоторые данные в файл в Fortran 90. Как я должен использовать WRITE (*,*) input чтобы значения были сгруппированы в колонки? 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 ответов


вы можете использовать подразумеваемые циклы 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   ...

если количество элементов не фиксируется во время компиляции, вы можете использовать


Это действительно зависит от того, какие данные вы пытаетесь записать в файл (т. е. есть ли у вас скаляр в цикле или массив...). Можете ли вы включить описание этого в свой вопрос?

Если вы пытаетесь написать скаляр несколько раз в одну и ту же строку, попробуйте использовать не-выдвигаясь I / O, передав аргумент ключевого слова advance="no" к оператору write, например

integer :: x

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

однако, имейте в виду сюрприз с не наступали I / O.


ответ зависит от вашего ответа на вопрос Криса. Если вам нужна одна строка, вам придется использовать не продвигающийся IO, как описано Крисом. Без этого с помощью нескольких отформатированных операторов записи вы всегда получите несколько строк.

кроме того, вам, вероятно, придется использовать форматированный IO вместо list-directed (*) IO. Правила свободны для list-directed IO. Различные компиляторы могут производить различные выходные данные. Со многими выходными элементами разрывы строк, вероятно, сохранятся выходные линии от слишком длинных.

вот формат, который должен работать, если все ваши переменные реалов:

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

Как насчет старого доброго дескриптора $ edit:

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

Не забудьте сделать запись(*,*) после вашего цикла...