Специальная программа Fortran 95 Простое чтение и письмо

Я пытаюсь написать программу с fortran 95, которая будет читать файл. Этот файл создается после вычисления программным обеспечением. После прочтения связанной информации из этого файла я хочу написать другой текстовый файл. У меня есть файл вроде этого;

Model_disp

 Analysis type NONLIN
 Step nr. 10 
 Load factor 1.000E+00 
 Result DISPLA TOTAL TRANSL
 Axes GLOBAL

 Nodnr TDtX TDtY TDtZ 
 301 -7.359E-03 -7.205E-02 2.207E-02



 Analysis type NONLIN
 Step nr. 27 
 Time 3.400E-02 
 Result DISPLA TOTAL TRANSL
 Axes GLOBAL

 Nodnr TDtX TDtY TDtZ 
 301 -7.356E-03 -7.202E-02 2.207E-02



 Analysis type NONLIN
 Step nr. 44 
 Time 6.800E-02 
 Result DISPLA TOTAL TRANSL
 Axes GLOBAL

 Nodnr TDtX TDtY TDtZ 
 301 -7.362E-03 -7.202E-02 2.209E-02
..............
..............
..............

 Analysis type NONLIN
 Step nr. 17010 
 Time 3.400E+01 
 Result DISPLA TOTAL TRANSL
 Axes GLOBAL

 Nodnr TDtX TDtY TDtZ 
 301 -2.726E-01 -6.948E+00 3.902E+00

Я хочу читать Time, TDtx и TDtz после этого, я хочу записать эти параметры в другой.txt файл. Этот файл имеет общую строку 11014.

Программа, которую я хочу написать с fortran, такова;

PROGRAM reading
IMPLICIT NONE

REAL :: Time, TDtx, TDtz


OPEN(1, FILE='Model_disp.txt', &
 STATUS='OLD', ACTION='READ'

READ(1,*), Time, TDtx, TDtz
PRINT*, Time, TDtx, TDtz

OPEN(2, FILE='disp.txt', STATUS='NEW', ACTION='WRITE')
 WRITE(2,*), Time, TDtx, TDtz

END PROGRAM

К сожалению, я потерпел неудачу. Я не знаю, где моя ошибка. Вы хотите мне помочь?

2 ответа

Предполагая, что вы хотите проанализировать файл, вам нужно сделать немного больше, чем ваши read утверждения. Сделав предположения, что:

  • На строке, начинающейся с "Время", есть ваше переменное time;
  • На строке после запуска "Nodnr" находятся ваши переменные TDtx и TDtx;
  • Линии заказываются соответствующим образом.

вы можете сделать что-то вроде (с соответствующими объявлениями, open и т.д.):

do
 read(unit_in, '(A)', iostat=iostat) line
 if (iostat.ne.0) exit
 if (line(1:4).eq.'Time') then
 read (line(5:), fmt1) time
 cycle
 end if
 if (line(1:5).eq.'Nodnr') then
 read (unit_in, fmt2) junk1, tdtx, junk2, tdtz
 write (unit_out, *) time, tdtx, tdtz
 end if
end do

где fmt1 и fmt2 являются желательными форматами.

Пример файла предполагает, что "Nodnr" на первом месте, если это так, что может быть обработано с соответствующими изменениями; Я предположил из вашего примера кода, что time будет прочитано первым.

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

Наконец, если вы просто выполняете обработку текста, а входной файл очень ненадежный, другие инструменты могут быть лучше (но не обязательно).


Если вы просто хотите прочитать входной файл в заданном формате, извлеките что-нибудь и напишите его в другом текстовом файле, языки сценариев (Python, Perl или так) будут лучше соответствовать вашим потребностям.

licensed under cc by-sa 3.0 with attribution.