Ввод списка имен сильно отличается от обычного ввода файла.

аюсь прочитать некоторые данные из файла, и обнаружение записи конечного файла важно, чтобы остановить чтение. Однако, в зависимости от размеров массива массива, используемого для чтения данных, я не могу правильно определить запись конечного файла, и моя программа на Фортране останавливается.

Программа ниже:

!integer, dimension(3) :: x                      ! line 1.1
!integer, dimension(3,10) :: x                   ! line 1.2
integer, dimension(10,3) ::                      ! line 1.3
integer :: status,i=1
character(len=100) :: error

open( 30, file='data.dat', status='old' )
do
  print *,i
  !read( 30, *, iostat=status, iomsg=error ) x          ! line 2.1
  !read( 30, *, iostat=status, iomsg=error ) x(:,i)     ! line 2.2
  read( 30, *, iostat=status, iomsg=error ) x(i,:)      ! line 2.3

  if ( status < 0 ) then        print *,'EOF'
    print *,'total of ',i-1,' lines read.'
    exit
  else if ( status > 0 ) then
    print *,'error cod: ',status
    print *,'error message: ', error
    stop
  else if ( status == 0 ) then
    print *,'reading ok.'
    i = i + 1
  end if
end do

С файлом data.dat было:

10 20 30
30 40 50

Когда строки 1.3 и 2.3 не закомментированы, появляется указанная ошибка:

Код ошибки: 5008

сообщение об ошибке: Прочитать прошлую запись ENDFILE

Однако, используя строки 1.1 и 2.1, или 1.2 и 2.2, программа работает, обнаруживая запись конечного файла.

Итак, мне нужна помощь в понимании того, почему я не могу использовать строки 1.3 и 2.3 для правильного чтения этого файла, поскольку я даю правильное количество элементов массива для команды чтения.

Я использую компилятор gfortran, версия 6.3.0.

РЕДАКТИРОВАТЬ: более простой пример

следующее выдает ошибку 5008 «Read last ENDFILE record»:

implicit none
integer x(2,2),s
open(20,file='noexist')
read(20,*,iostat=s)x
write(*,*)s
end

если мы сделаемx скаляр или массив одного размера (любого размера) мы получаем ожидаемый-1 Флаг EOF. Неважно, если файл на самом деле не существует или он пустой. Если файл содержитнесколько, но недостаточно, данные трудно понять, какое возвращаемое значение вы можете получить.

Ответы на вопрос(2)

Ваш ответ на вопрос