2009-09-07 5 views
5

콘솔 화면에 DO 루프로 계산 작업의 진행 상황을 표시하고 싶습니다. 이 같은 단말로 진행 변수를 출력 할 수콘솔 화면의 현재 행을 덮어 쓰려면 PRINT 또는 WRITE 문을 어떻게 포맷합니까?

PROGRAM TextOverWrite_WithLoop 
IMPLICIT NONE 
INTEGER :: Number, Maximum = 10 
DO Number = 1, MAXIMUM 
    WRITE(*, 100, ADVANCE='NO') REAL(Number)/REAL(Maximum)*100  
    100 FORMAT(TL10, F10.2) 
    ! Calcultations on Number  
END DO  
END PROGRAM TextOverWrite_WithLoop 

콘솔 화면에 상기 코드의 출력은 :

10.00 20.00 30.00 40.00 50.00 60.00 70.00 80.00 90.00 100.00

모두 같은 줄에 있으며 콘솔 창으로 만 묶습니다.

ADVANCE = '없음' 인수와 TL10 (탭이 너무 많은 공간을 왼쪽) 편집 기술자, 예를 들어, 같은 줄에 텍스트를 덮어 잘 작동 다음 코드의 출력 :

WRITE(*, 100, ADVANCE='NO') 100, 500 
100 FORMAT(I3, 1X, TL4, I3) 

은 다음과 같습니다 대신

500

:

100 500

때문에 TL4 편집 기술자의.

이 두 인스턴스에서 WRITE 문은 다른 WRITE 문이나 DO- 루프와 같은 동일한 WRITE satement의 이전 실행에 의해 작성된 것을 덮어 쓸 수 없다고 결론을 내릴 수 있습니다.

어떻게 든이 문제를 해결할 수 있습니까?

Windows 7 RC1에서 FTN95 컴파일러를 사용하고 있습니다. (G95 컴파일러의 설치 프로그램은 Windows 7 RC1을 bluescreen으로조차도 Vista에서 잘 작동한다고 생각합니다.)

질문에 대한 대답은 Supressing line breaks in Fortran 95 write statements이지만이 질문에 대한 답변은 새로운 출력을 의미하므로 저에게 도움이되지 않습니다. 같은 줄의 이전 출력에 추가됩니다. 새 출력 대신 이전 출력을 덮어 씁니다.

미리 감사드립니다.

+0

어떤 컴파일러와 OS를 사용하고 있습니까? – DigitalRoss

+0

@ digitalross, compiler = FTN95, OS = Windows 7 RC1 – systemovich

+0

아마도 대답을 받아 들여야합니까? –

답변

3

포트란 표준의 범위 내에서이 질문에 대한 해결책이 없습니다. 컴파일러는 포트란 문자열에서 백 슬래시를 이해한다면, (당신이 옵션 -fbackslash을 사용하는 경우 GNU 포트란는 않습니다), 당신은

write (*,"(A)",advance="no") "foo" 
    call sleep(1) 
    write (*,"(A)",advance="no") "\b\b\bbar" 
    call sleep(1) 
    write (*,"(A)",advance="no") "\b\b\bgee" 
    call sleep(1) 
    write (*,*) 
    end 

이 그 줄에 이전에 기록 된 문자를 지우려면 백 슬래시 문자 (\b)를 사용을 작성할 수 있습니다.

NB : 컴파일러가 advance="no"을 인식하지 못하면 형식 문자열에 $ 지정자와 같은 비표준 트릭을 사용할 수 있습니다.

8

다음은 캐리지 리턴을 인코딩하는 데 ACHAR(13)을 사용하여 시스템간에 이식 가능해야합니다.

  character*1 creturn 
    ! CODE:: 
      creturn = achar(13) ! generate carriage return 
    ! other code ... 
      WRITE(* , 101 , ADVANCE='NO') creturn , i , npoint 
101  FORMAT(a , 'Point number : ',i7,' out of a total of ',i7) 
+0

[코드 /] 태그 (또는 들여 쓰기)를 사용하여 코드의 구문을 강조하고보다 쉽게 ​​읽을 수 있도록해야합니다. :) –

-1
OPEN(6,CARRIAGECONTROL ='FORTRAN') 
DO I=1,5 
WRITE(6,'(1H+" ",I)') I 
ENDDO 
+0

일반적으로 대답은 코드의 의도에 대한 설명과 다른 사람을 소개하지 않고 문제를 해결하는 이유를 설명하는 경우 훨씬 더 유용합니다. (이 게시물은 적어도 하나의 사용자에 의해 표시되었으므로 아마 설명이없는 답변이 삭제되어야한다고 생각했거나 아마도 "아마"는 해클을 제기했을 것입니다.) –

+0

설명이 필요합니다. 주'CARRIAGECONTROL ='은 표준을 따르지 않고 다시 시작하는 유닛 6 (그것이 output_unit이라고 가정하자)은 까다 롭습니다. 특히 비표준 지시자에서는 까다 롭습니다. 또한 Hollerith는 현대 Fortran에서 삭제됩니다. ''1H + '''의 의미를 설명해야합니다. 또한, 표준 포트란에서'I0'을 사용해야하며'I'는 허용되지 않습니다. –

0

다음은 완벽 G95 포트란을 사용하여 일했다 :

 NF = NF + 1 
     IF(MOD(NF,5).EQ.0) WRITE(6,42,ADVANCE='NO') NF, ' PDFs'//CHAR(13) 
    42 FORMAT(I6,A) 

는 준 : 5 PDF 파일

을 같은 줄에 # 1 위치에 커서를 떠나. 다음 업데이트에서 은 5가 10으로 바뀌 었습니다. ASCII 13 (십진수)은 캐리지 리턴입니다.