EOF标记后不允许顺序读取或写入

时间:2017-01-22 13:59:03

标签: fortran

我有这段代码:

      SUBROUTINE FNDKEY
     1(   FOUND      ,IWBEG      ,IWEND      ,KEYWRD     ,INLINE     ,
     2    NFILE      ,NWRD       )
      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
      LOGICAL FOUND
      CHARACTER*80 INLINE
      CHARACTER*(*) KEYWRD
      DIMENSION
     1    IWBEG(40), IWEND(40)
C***********************************************************************
C FINDS AND READS A LINE CONTAINING A SPECIFIED KEYWORD FROM A FILE.
C THIS ROUTINE SEARCHES FOR A GIVEN KEYWORD POSITIONED AS THE FIRST
C WORD OF A LINE IN A FILE.
C IF THE GIVEN KEYWORD IS FOUND THEN THE CORRESPONDING LINE IS READ AND
C RETURNED TOGETHER WITH THE NUMBER OF WORDS IN THE LINE AND TWO INTEGER
C ARRAYS CONTAINING THE POSITION OF THE BEGINNING AND END OF EACH WORD.
C***********************************************************************
 1000 FORMAT(A80)
C
      FOUND=.TRUE.
      IEND=0
   10 READ(NFILE,1000,END=20)INLINE
      NWRD=NWORD(INLINE,IWBEG,IWEND)
      IF(NWRD.NE.0)THEN
        IF(INLINE(IWBEG(1):IWEND(1)).EQ.KEYWRD)THEN
          GOTO 999
        ENDIF
      ENDIF
      GOTO 10
   20 IF(IEND.EQ.0)THEN
        IEND=1
        REWIND NFILE
        GOTO 10
      ELSE
        FOUND=.FALSE.
      ENDIF
  999 RETURN
      END

以下文件名为" 2.dat"我想读的是:

    TITLE
Example 7.5.3 - Simply supported uniformly loaded circular plate

ANALYSIS_TYPE     3 (Axisymmetric)
AXIS_OF_SYMMETRY  Y

LARGE_STRAIN_FORMULATION   OFF

SOLUTION_ALGORITHM  2

ELEMENT_GROUPS 1
  1 1 1

ELEMENT_TYPES 1
  1  QUAD_8
       4 GP

ELEMENTS 10
       1 1      1    19    11    20    16    21    13    22
       2 1     13    21    16    23    10    24     2    25
       3 1      3    26    18    27    17    28     4    29
       4 1     18    30     7    31    12    32    17    27
       5 1      3    33     5    34    14    35    18    26
       6 1     18    35    14    36     6    37     7    30
       7 1      5    38     8    39    15    40    14    34
       8 1     14    40    15    41     9    42     6    36
       9 1     10    23    16    43    17    32    12    44
      10 1     16    20    11    45     4    28    17    43

NODE_COORDINATES 45   CARTESIAN
       1     0.0000000000e+00     0.0000000000e+00
       2     0.0000000000e+00     1.0000000000e+00
       3     6.0000000000e+00     0.0000000000e+00
       4     4.0000000000e+00     0.0000000000e+00
       5     8.0000000000e+00     0.0000000000e+00
       6     8.0000000000e+00     1.0000000000e+00
       7     6.0000000000e+00     1.0000000000e+00
       8     1.0000000000e+01     0.0000000000e+00
       9     1.0000000000e+01     1.0000000000e+00
      10     2.0000000000e+00     1.0000000000e+00
      11     2.0000000000e+00     0.0000000000e+00
      12     4.0000000000e+00     1.0000000000e+00
      13     0.0000000000e+00     5.0000000000e-01
      14     8.0000000000e+00     5.0000000000e-01
      15     1.0000000000e+01     5.0000000000e-01
      16     2.0000000000e+00     5.0000000000e-01
      17     4.0000000000e+00     5.0000000000e-01
      18     6.0000000000e+00     5.0000000000e-01
      19     1.0000000000e+00     0.0000000000e+00
      20     2.0000000000e+00     2.5000000000e-01
      21     1.0000000000e+00     5.0000000000e-01
      22     0.0000000000e+00     2.5000000000e-01
      23     2.0000000000e+00     7.5000000000e-01
      24     1.0000000000e+00     1.0000000000e+00
      25     0.0000000000e+00     7.5000000000e-01
      26     6.0000000000e+00     2.5000000000e-01
      27     5.0000000000e+00     5.0000000000e-01
      28     4.0000000000e+00     2.5000000000e-01
      29     5.0000000000e+00     0.0000000000e+00
      30     6.0000000000e+00     7.5000000000e-01
      31     5.0000000000e+00     1.0000000000e+00
      32     4.0000000000e+00     7.5000000000e-01
      33     7.0000000000e+00     0.0000000000e+00
      34     8.0000000000e+00     2.5000000000e-01
      35     7.0000000000e+00     5.0000000000e-01
      36     8.0000000000e+00     7.5000000000e-01
      37     7.0000000000e+00     1.0000000000e+00
      38     9.0000000000e+00     0.0000000000e+00
      39     1.0000000000e+01     2.5000000000e-01
      40     9.0000000000e+00     5.0000000000e-01
      41     1.0000000000e+01     7.5000000000e-01
      42     9.0000000000e+00     1.0000000000e+00
      43     3.0000000000e+00     5.0000000000e-01
      44     3.0000000000e+00     1.0000000000e+00
      45     3.0000000000e+00     0.0000000000e+00

NODES_WITH_PRESCRIBED_DISPLACEMENTS   6
       1     10   0.000 0.000 0.000
       2     10   0.000 0.000 0.000
       8     01   0.000 0.000 0.000
      13     10   0.000 0.000 0.000
      22     10   0.000 0.000 0.000
      25     10   0.000 0.000 0.000

MATERIALS 1
  1 VON_MISES
     0.0
     1.E+07  0.240
       2
       0.000     16000.0
       1.000     16000.0

LOADINGS  EDGE
EDGE_LOADS  5
 2 3    10    24     2
        1.000 1.000 1.000 0.000 0.000 0.000
 4 3     7    31    12
        1.000 1.000 1.000 0.000 0.000 0.000
 6 3     6    37     7
        1.000 1.000 1.000 0.000 0.000 0.000
 8 3     9    42     6
        1.000 1.000 1.000 0.000 0.000 0.000
 9 3    10    12    44
        1.000 1.000 1.000 0.000 0.000 0.000

*
* Monotonic loading to collapse
*
INCREMENTS 12
  100.0     0.10000E-06    11  1 1 0 1 0
  100.0     0.10000E-06    11  1 1 0 1 0
   20.0     0.10000E-06    11  1 1 0 1 0
   10.0     0.10000E-06    11  1 1 0 0 0
   10.0     0.10000E-06    11  1 1 0 1 0
   10.0     0.10000E-06    11  1 1 0 0 0
    5.0     0.10000E-06    11  1 1 1 1 0
    2.0     0.10000E-06    11  1 1 0 0 0
    2.0     0.10000E-06    11  1 1 0 0 0
    0.5     0.10000E-06    11  1 1 1 1 0
    0.25    0.10000E-06    11  1 1 0 0 0
    0.02    0.10000E-06    11  1 1 0 0 0

我收到以下错误:

At line 22 of file GENERAL/fndkey.f (unit = 15, file = './2.dat')
Fortran runtime error: Sequential READ or WRITE not allowed after EOF marker, possibly use REWIND or BACKSPACE

以下文件是调用FNDKEY的文件。当它调用FNDKWYm时,它将字符串" RESTART"传递给KEYWRD。

          SUBROUTINE RSTCHK(  RSTINP     ,RSTRT      )
      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
      LOGICAL RSTRT
      CHARACTER*256 RSTINP
C
      LOGICAL AVAIL,FOUND
      CHARACTER*80 INLINE
      DIMENSION IWBEG(40),IWEND(40)
C***********************************************************************
C CHECKS WETHER MAIN DATA IS TO BE READ FROM INPUT RE-START FILE
C AND SET INPUT RE-START FILE NAME IF REQUIRED
C***********************************************************************
 1000 FORMAT(////,
     1' Main input data read from re-start file'/
     2' ======================================='///
     3'            Input re-start file name ------> ',A)
C
C Checks whether the input data file contains the keyword RESTART
C
        CALL FNDKEY
     1(   FOUND     ,IWBEG    ,IWEND    ,'RESTART',
     2    INLINE    ,15       ,NWRD     )
        IF(FOUND)THEN
C sets re-start flag and name of input re-start file
          RSTRT=.TRUE.
          RSTINP=INLINE(IWBEG(2):IWEND(2))//'.rst'
          WRITE(16,1000)INLINE(IWBEG(2):IWEND(2))//'.rst'
C checks existence of the input re-start file
          INQUIRE(FILE=RSTINP,EXIST=AVAIL)
          IF(.NOT.AVAIL)CALL ERRPRT('ED0096')
        ELSE
          RSTRT=.FALSE.
        ENDIF
C
      RETURN
      END

1 个答案:

答案 0 :(得分:0)

我解决了在BACKSPACE(NFILE)上方添加命令RETURN的问题:

      SUBROUTINE FNDKEY
     1(   FOUND      ,IWBEG      ,IWEND      ,KEYWRD     ,INLINE     ,
     2    NFILE      ,NWRD       )
      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
      LOGICAL FOUND
      CHARACTER*80 INLINE
      CHARACTER*(*) KEYWRD
      DIMENSION
     1    IWBEG(40), IWEND(40)
C***********************************************************************
C FINDS AND READS A LINE CONTAINING A SPECIFIED KEYWORD FROM A FILE.
C THIS ROUTINE SEARCHES FOR A GIVEN KEYWORD POSITIONED AS THE FIRST
C WORD OF A LINE IN A FILE.
C IF THE GIVEN KEYWORD IS FOUND THEN THE CORRESPONDING LINE IS READ AND
C RETURNED TOGETHER WITH THE NUMBER OF WORDS IN THE LINE AND TWO INTEGER
C ARRAYS CONTAINING THE POSITION OF THE BEGINNING AND END OF EACH WORD.
C***********************************************************************
 1000 FORMAT(A80)
C
      FOUND=.TRUE.
      IEND=0

   10 READ(NFILE,1000,END=20)INLINE
      NWRD=NWORD(INLINE,IWBEG,IWEND)
      PRINT *,KEYWRD
      IF(NWRD.NE.0)THEN
        IF(INLINE(IWBEG(1):IWEND(1)).EQ.KEYWRD)THEN
          GOTO 999
        ENDIF
      ENDIF
      GOTO 10
   20 IF(IEND.EQ.0)THEN
        IEND=1
        REWIND NFILE
        GOTO 10
      ELSE
        FOUND=.FALSE.
      ENDIF
      BACKSPACE(NFILE)
  999 RETURN
      END