Где ошибка времени выполнения 7 строки (чтение матрицы из файла)?

Код:

program a
implicit double precision (a-h,o-z)
dimension a(3,3),b(3)

open(1,file='matrix.dat')
do i=1,3
    read(1,*) b(i)(a(i,j),j=1,3)
enddo
close(1)

stop
end

Ошибка:

At line 7 of file ea.for (unit=1, file='matrix.dat')
Fortran runtime error: End of file

матрица а(3*3), б(3):

3
2.d0   -7.d0    4.d0    4.d0
1.d0    9.d0   -6.d0    4.d0
-3.d0    8.d0    5.d0    2.d0

person panos deemac    schedule 17.10.2013    source источник


Ответы (2)


Не используйте 1 в качестве номера устройства — попробуйте что-то вроде 1234.! Нижние номера юнитов зарезервированы для «специальных юнитов», таких как STDOUT, STDERR, STDIN. См. также этот пост: ошибка сегментации в linux для ansys

Чтобы проверить, пытаетесь ли вы читать дальше конца файла или неправильного количества столбцов, вы можете поместить iostat=ierror в свой оператор read, чтобы проверить, произошла ли ошибка при чтении. ierror<0 соответствует «концу файла», а ierror>0 означает что во время read произошла ошибка.

Если то, что вы указали для значений матрицы, соответствует файлу matrix.dat, то вы не читаете первое (целочисленное) значение 3.

Это для иллюстрации и должно работать:

program a_test
  implicit none
  real    :: a(3,3),b(3)
  integer :: dummy, ierror, i, j

  open(unit=1234,file='matrix.dat')
  read(1234,*) dummy
  do i=1,3
      read(1234,*,iostat=ierror) b(i),(a(i,j),j=1,3)
      if (ierror>0) then
        stop 'Error while reading from file. '
      elseif (ierror<0) then
        stop 'Reached end of file. '
      endif
  enddo
  close(1234)

  write(*,*) 'a='
  write(*,*) a(1,:)
  write(*,*) a(2,:)
  write(*,*) a(3,:)
  write(*,*) 'b=',b
end
person Alexander Vogt    schedule 17.10.2013
comment
Ошибочно ли писать число 3(=matrix(3x3)) в начале файла matrix.dat? заранее спасибо. - person panos deemac; 17.10.2013
comment
Это зависит от... Если вы не знаете, насколько велика матрица в файле на самом деле, рекомендуется сохранить размер/форму матрицы (на самом деле это необходимо сделать, чтобы установить правильные диапазоны). Для Fortran 90+ вы также можете работать с allocatable массивами, которые вы allocate прочитаете в размере/форме матрицы. Если размер вашей матрицы фиксирован, вы можете жестко закодировать размеры и не нужно сохранять их в файл. - person Alexander Vogt; 17.10.2013

Команды чтения в Фортране перемещают активную точку в файле на следующую строку, чтобы следующая команда чтения могла прочитать следующую строку. Мое лучшее предположение состоит в том, что последний вызов «чтения» ищет символ конца строки, пытаясь перейти к следующей строке, но вместо этого упираясь в конец файла. Посмотрите, решит ли проблему добавление жесткого возврата в конце входного файла. (Я знаю, что некоторые старые редакторы жалуются, если в конце файла нет пустой строки, и я думаю, именно поэтому.)

person Stephen Amsel    schedule 17.10.2013
comment
Больше похоже, что проблема заключается в чтении первой строки; он говорит программе, что там будет 4 значения, а программа находит 1. - person Kyle Kanos; 17.10.2013
comment
Неа. Проблема была в конце файла. Александр был прав. Блок 1 в Фортране зарезервирован для ввода с клавиатуры. - person Stephen Amsel; 17.10.2013