2016-02-14 2 views
-2

У меня возникла проблема с запуском программы для чтения текстового файла в качестве входного файла. Этот входной файл похож на матрицу с 3 столбцами - 3 номера с форматом (3 (F3.6,1x)) и 4368 строк.Ошибка чтения текстового файла в конце файла

Входной файл:

602340.440000 129706.190000 28.892939 
602340.880000 129706.390000 28.955128 
602884.500000 128780.700000 29.876873 
602884.380000 128781.190000 29.875114 
602884.250000 128781.660000 29.885448 
602884.130000 128782.150000 29.895996 
602883.940000 128782.630000 29.899380 
602883.810000 128783.120000 29.903221 
602883.690000 128783.590000 29.907070 

ПРОГРАММА является:

USE BIEF 
    USE DECLARATIONS_TELEMAC2D 
    IMPLICIT NONE 
    INTEGER LNG,LU, ITRAC,I, NSOM,J, K, NDOWN 
    INTEGER, PARAMETER :: NLINE =4368 
    DOUBLE PRECISION, PARAMETER:: BATHY_RADIER_up= 29.84D0 
    DOUBLE PRECISION, PARAMETER:: DEPTH_up = 2.15D0 
    REAL :: A(5000),B(5000),C(5000) 
    DOUBLE PRECISION :: XPOLYD(14), YPOLYD(14), INPOLYD(14) 
    COMMON/INFO/LNG,LU 

    DOUBLE PRECISION XPOLY(6), YPOLY(6),COTE_RADIER_up 


    NSOM = 6 
    XPOLY(1) = 602883.13 
    XPOLY(2) = 602886.15 
    XPOLY(3) = 602887.15 
    XPOLY(4) = 602905.46 
    XPOLY(5) = 602902.52 
    XPOLY(6) = 602884.13 


    YPOLY(1) = 128779.99 
    YPOLY(2) = 128780.80 
    YPOLY(3) = 128777.12 
    YPOLY(4) = 128741.21 
    YPOLY(5) = 128739.75 
    YPOLY(6) = 128775.96 



    AT = 0.D0 


    CALL OS('X=0  ' , X=U) 
    CALL OS('X=0  ' , X=V) 


    IF(CDTINI(1:10).EQ.'COTE NULLE'.OR. 
* CDTINI(1:14).EQ.'ZERO ELEVATION') THEN 
    CALL OS('X=C  ' , H , H , H , 0.D0) 
    CALL OS('X=X-Y ' , H , ZF , H , 0.D0) 
    ELSEIF(CDTINI(1:14).EQ.'COTE CONSTANTE'.OR. 
*  CDTINI(1:18).EQ.'CONSTANT ELEVATION') THEN 
    CALL OS('X=C  ' , H , H , H , COTINI) 
    CALL OS('X=X-Y ' , H , ZF , H , 0.D0 ) 
    ELSEIF(CDTINI(1:13).EQ.'HAUTEUR NULLE'.OR. 
*  CDTINI(1:10).EQ.'ZERO DEPTH') THEN 
    CALL OS('X=C  ' , H , H , H , 0.D0 ) 
    ELSEIF(CDTINI(1:17).EQ.'HAUTEUR CONSTANTE'.OR. 
*  CDTINI(1:14).EQ.'CONSTANT DEPTH') THEN 
    CALL OS('X=C  ' , H , H , H , HAUTIN) 
    ELSEIF(CDTINI(1:13).EQ.'PARTICULIERES'.OR. 
*  CDTINI(1:10).EQ.'PARTICULAR'.OR. 
*  CDTINI(1:07).EQ.'SPECIAL') THEN 


    NDOWN = 14 

    XPOLYD(1) = 602883.13 
    XPOLYD(2) = 602886.15 
    XPOLYD(3) = 602864.47 
    XPOLYD(4) = 602837.90 
    XPOLYD(5) = 602821.91 
    XPOLYD(6) = 602649.77 
    XPOLYD(7) = 602634.35 
    XPOLYD(8) = 602345.08 
    XPOLYD(9) = 602326.07 
    XPOLYD(10) = 602619.31 
    XPOLYD(11) = 602638.33 
    XPOLYD(12) = 602811.64 
    XPOLYD(13) = 602831.52 
    XPOLYD(14) = 602857.16 


    YPOLYD(1) = 128779.99 
    YPOLYD(2) = 128780.80 
    YPOLYD(3) = 128867.74 
    YPOLYD(4) = 128936.74 
    YPOLYD(5) = 128953.95 
    YPOLYD(6) = 129105.43 
    YPOLYD(7) = 129143.43 
    YPOLYD(8) = 129713.38 
    YPOLYD(9) = 129708.26 
    YPOLYD(10) = 129136.41 
    YPOLYD(11) = 129094.72 
    YPOLYD(12) = 128941.16  
    YPOLYD(13) = 128931.09 
    YPOLYD(14) = 128865.81 

    PRINT *, 'opening file' 
    DO 10 J=1,NPOIN 
    IF(INPOLY(X(J),Y(J),XPOLY,YPOLY,NSOM)) THEN 
    PRINT *, 'upstream area' 
     H%R(J)=MAX(0.D0,COTE_RADIER_up-ZF%R(J)) 
     U%R(J)=0.0D0 
     PRINT *, 'upstream area' 
     write(lu,*) 'upstream ....',J,H%r(J) 

    ELSE 
    IF(INPOLY(X(J),Y(J),XPOLYD,YPOLYD,NDOWN)) THEN 
    OPEN(unit =90, FILE = 'cunnette_xyz.txt', FORM='FORMATTED') 
    PRINT *, 'downstream area' 
    READ(90,*) A(K),B(K),C(K) 
    PRINT *, 'already read' 
     DO K=1,NLINE 
    PRINT *, "number of lines read:", NLINE 
     IF(A(K).EQ.X(J).AND.B(K).EQ.Y(J)) then 
      PRINT *, 'Nodes are inside' 
      H%R(K)=0.45D0 
      U%R(K)=0.D0 
     ELSE 
      H%R(K)=0.0D0 
      U%R(K)=0.0D0 
     ENDIF 
     ENDDO 
    CLOSE(90) 
    ENDIF 
    ENDIF 

10 CONTINUE 

    ELSE 
    IF(LNG.EQ.1) THEN 
    WRITE(LU,*) 'CONDIN : CONDITION INITIALE NON PREVUE : ',CDTINI 
    ENDIF 
    IF(LNG.EQ.2) THEN 
    WRITE(LU,*) 'CONDIN: INITIAL CONDITION UNKNOWN: ',CDTINI 
    ENDIF 
    STOP 
    ENDIF 

    IF(NTRAC.GT.0) THEN 
    DO ITRAC=1,NTRAC 
     CALL OS('X=C  ' , X=T%ADR(ITRAC)%P , C=TRAC0(ITRAC)) 
    ENDDO 
    ENDIF 

    CALL OS('X=C  ' , VISC , VISC , VISC , PROPNU) 

    RETURN 
    END   

Сообщение об ошибке при запуске является:

at line read file: Fortran runtime error: End of file.

Мой последний выход 'вниз по течению область' AFTRE открыта Command. Может ли кто-нибудь помочь мне, пожалуйста?

+0

Просьба представить первые несколько строк вашего входного файла. – trincot

+2

Это не полный пример (нет 'end'), поэтому в полной программе вы задаете значение' k' в любой точке? Как и в приведенном выше комментарии, укажите структуру файла. Также может быть лучше, если бы вы могли предоставить полностью содержащийся пример, например, в [mcve]. – francescalus

+1

Возможный дубликат [Получение ошибки времени выполнения fortran: конец файла] (http://stackoverflow.com/questions/22584283/getting-fortran-runtime-error-end-of-file) – trincot

ответ

0

Прежде всего, вы открываете файл повторно для каждого значения J. Это кажется неправильным.

Во-вторых, вы не указали переменную NPOIN значение (больше 1), поэтому ваш внешний цикл на J не остановится (я думаю), и это в конечном итоге приведет к тому, что вы попытаетесь прочитать за пределами файл.

У вас есть вложенные петли, один на J и один на K, что кажется нелогичным. У вас должен быть только один.

Открыть файл вне цикла J, а затем прочитать строки на строку, пока не будет достигнут конец файла:

INTEGER :: Reason 
INTEGER :: NPOIN 

OPEN(unit =90, IOSTAT=Reason, FILE = 'cunnette_xyz.txt', FORM='FORMATTED') 
IF (Reason > 0) THEN 
     * ... something wrong ... 
     PRINT *, 'Error opening file' 
     STOP 
END IF 
NPOIN = 0 
DO 
    NPOIN = NPOIN + 1 
    READ(*,*, IOSTAT=Reason) A(NPOIN), B(NPOIN), C(NPOIN) 
    IF (Reason > 0) THEN 
     PRINT *, 'Error reading input from file. Aborted' 
     STOP 
    ELSE IF (Reason < 0) THEN 
     * ... end of file reached ... 
     NPOIN = NPOIN - 1 
     PRINT *, 'All data read from file' 
     EXIT 
    END IF 
END DO 
* All input should be in A, B, C arrays now, with NPOIN entries 

DO K=1, NPOIN 
    * Your processing comes here. No more file I/O. 
END DO 
+0

Большое спасибо за ваш добрый ответ. Я пробовал это, но я не работал. Как мне сделать вторую линию линии в строке? – gashin

+0

Во-первых, что вы имеете в виду с * это не сработало *. Не могли бы вы добавить новый абзац на свой вопрос, где вы публикуете код, который вы использовали для реализации первой идеи (только соответствующие части)? – trincot

+0

Почему код пытается прочитать количество строк из файла в зависимости от размера массивов? Единственное выражение 'read', которое я вижу, каждый раз считывает только один элемент из каждого из трех массивов и выполняется число' NPOIN'. 'NPOIN' не имеет значения, определенного в программе, а' k' не находится в точке первого чтения, но это, похоже, не является точкой ответа. – francescalus

Смежные вопросы