Фортран читает только первую запись файла, а затем встречает преждевременный EOF - PullRequest
0 голосов
/ 13 марта 2020

У меня небольшая проблема с чтением данных из CSV-файлов, сгенерированных Matlab.

Сначала немного общей информации:

ОС: MA C ОС Catalina 10.15.3 Компилятор Fortran: gfortran 9.2 (обновление oct 2019, сообщается для Catalina OS). среда программирования: Elcipse 2019-12 (4.14.0)

Вот фрагмент кода, с которым у меня возникли проблемы:

filename='positie_frame_cam'
extension='.txt'
do icam=1,6,1
    write (getal,'(I1)') icam ! converting integer to string using an 'internal file'
    totalname=filename//getal//extension
    print*,totalname
    open(unit=icam+10,file=totalname, form='formatted',action='read')
    nlines(icam)=0
    iop=0
    i=0
    do while (iop.ge.0)
      i=i+1
      write(0,*)' regel nummer ',i
      read(icam+10,*,iostat=iop)tel,DUMY(1),DUMY(2),& 
      DUMY(3),DUMY(4),DUMY(5),DUMY(6),DUMY(7)
      write(0,*) 'iostat=',iop
      write(0,*) tel,DUMY(1),DUMY(2),&
      DUMY(3),DUMY(4),DUMY(5),DUMY(6),DUMY(7)
      nlines(icam)=nlines(icam)+1
      if (iop.ge.0) then
         nlines(icam)=nlines(icam)-1
         write(0,*) 'something went wrong!'
         close(icam+10)
      endif
      if (iop.eq.-1)then
         write(0,*)'eof'
         close(icam+10)
         exit
      endif
    end do
end do

Вот пример 6 файлов, которые я пытаюсь прочитать:

1,0.00000000,0.36611265,0.05310654,0.60107656,-0.02129885,0.99435631,-0.10393212
1,0.00833892,0.36611265,0.05310654,0.60107656,-0.02129885,0.99435631,-0.10393212
1,0.01667784,0.36486442,0.05303874,0.59982310,-0.02163688,0.99431165,-0.10428895
1,0.02501677,0.35989577,0.05282108,0.59855295,-0.02244646,0.99420581,-0.10512358
1,0.03335569,0.35492529,0.05268669,0.59727332,-0.02325602,0.99409861,-0.10595804
1,0.04169461,0.35368452,0.05266613,0.59726437,-0.02341294,0.99407797,-0.10611699
1,0.05003353,0.35491671,0.05268653,0.59602339,-0.02343777,0.99407317,-0.10615646
1,0.05837246,0.35862988,0.05277895,0.59479665,-0.02314764,0.99410979,-0.10587683
1,0.06671138,0.36359068,0.05297500,0.59481924,-0.02251773,0.99419203,-0.10523858
1,0.07505030,0.36483061,0.05303698,0.59482341,-0.02236010,0.99421248,-0.10507885

Это вывод, который я получаю для одного файла:

Last login: Thu Mar 12 09:19:00 on ttys001
/Users/fclemens/eclipse-workspace/Fit_ellipsoid/Release/Fit_ellipsoid ; exit;

The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.
(base) wlan-145-94-195-39:~ fclemens$ /Users/fclemens/eclipse-workspace/Fit_ellipsoid/Release/Fit_ellipsoid ; exit;
 positie_frame_cam1.txt
  regel nummer            1
 iostat=           0
  1   0.0000000000000000 0.36611264999999998  5.3106540000000001E-002  0.60107655999999998 -2.1298850000000001E-002  0.99435631000000002   -0.10393212000000000     
 something went wrong!
  regel nummer            2
 iostat=          -1
  1   0.0000000000000000 0.36611264999999998  5.3106540000000001E-002  0.60107655999999998 -2.1298850000000001E-002  0.99435631000000002   -0.10393212000000000     
 eof

Итак, очевидно, что запись 1 успешно прочитана, но затем первая запись снова читается вместо второй, и eof обнаруживается. Я не уверен, как решить эту проблему.

1 Ответ

2 голосов
/ 13 марта 2020

Ваш код четко записывает something went wrong! в вашем выходном примере.

     write(0,*) 'something went wrong!'
     close(icam+10)

Это означает, что файл закрыт, а затем он пытается снова прочитать с закрытого блока, и он не работает хорошо.

Скорее всего, вы хотели использовать .gt. вместо .ge. в

if (iop.ge.0) then

Однако я настоятельно! предлагаю вместо этого использовать >. Это намного более читабельно, и вы, скорее всего, обнаружите проблему, вместо того, чтобы спрашивать по inte rnet.

После этого вам понадобится exit после оператора close в этом случае филиал.

...