Пожалуйста, попробуйте это как простое решение для вашей проблемы:
program readmixnum
implicit none
integer::i,st
character*256::line
real::rdat(4,2)
complex::cdat(4,2)
do i=1, 4
read(100,'(A)',iostat=st) line
read(line,*,iostat=st) rdat(i,:)
cdat(i,:) = rdat(i,:)
if (st /= 0) then
read(line,*,iostat=st) rdat(i,1), cdat(i,2)
cdat(i,1) = rdat(i,1)
if (st /= 0) then
read(line,*,iostat=st) cdat(i,1), rdat(i,2)
cdat(i,2) = rdat(i,2)
if (st /= 0) then
read(line,*,iostat=st) cdat(i,:)
endif
endif
endif
write(*,*) cdat(i,1:2)
end do
end program
Требуется одна реальная матрица rdat
с таким же рангом, что и у вашей сложной cdat
. Одна строка входного файла fort.100
сохраняется в переменной line
. Это предотвращает оператор backspace
во время проверок числового формата.
Проверки числового формата выполняются с параметром iostat
. Если это значение равно 0, то считывание прошло успешно и правильный формат числа. Задача состоит в том, чтобы опробовать все возможные комбинации.
Вывод:
( 2.33999991 , 0.00000000 ) ( 4.50000000 , 0.00000000 )
( 23.1000004 , 0.300000012 ) ( 4.50000000 , 0.00000000 )
( 3.09999990 , 0.300000012 ) ( 3.20000005 , 1.00000000 )
( 2.40000010 , 0.00000000 ) ( 32.2000008 , 12.0000000 )
для компиляции с gfortran
версия 6.3.0 на компьютере с Linux.
Надеюсь, это поможет.