2009-09-07 9 views
5

Chcę wyświetlić postęp obliczeń wykonanych pętlą DO na ekranie konsoli. Mogę drukować zmienną postępu do terminala tak:Jak sformatować instrukcję PRINT lub WRITE w celu nadpisania bieżącego wiersza na ekranie konsoli?

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 

Wyjście powyższego kodu na ekranie konsoli jest:

10,00 20,00 30,00 40,00 50,00 60,00 70,00 80,00 90,00 100,00

Wszystko w tej samej linii, opakowane tylko przez okno konsoli.

ADVANCE = „Nie” argumentem i TL10 (tab pozostawił tak wiele spacji) edit deskryptor działa dobrze, aby zastąpić tekst na tej samej linii, na przykład wyjście z następującego kodu:

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

Czy:

Zamiast:

Ponieważ deskryptora edycji TL4.

Z tych dwóch przykładów można wywnioskować, że instrukcja WRITE nie może nadpisać tego, co zostało napisane przez inną instrukcję WRITE lub przez poprzednie wykonanie tego samego WRITE satement (jak w pętli DO).

Czy można to jakoś pokonać?

Używam kompilatora FTN95 w systemie Windows 7 RC1. (Program instalacyjny bluetootha z kompilatorem G95 Windows 7 RC1, nawet myślę, że działa dobrze na Vista.)

Wiem o pytaniu Supressing line breaks in Fortran 95 write statements, ale to nie działa dla mnie, ponieważ odpowiedź na to pytanie oznacza nowe wyjście jest dodawany do poprzedniego wyjścia w tej samej linii; zamiast nowego wyjścia nadpisując poprzednie dane wyjściowe.

Z góry dziękuję.

+0

Który kompilator i system operacyjny jest włączony? – DigitalRoss

+0

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

+0

Może powinieneś zaakceptować odpowiedź? –

Odpowiedz

3

Nie ma rozwiązania tego pytania w zakresie standardów Fortran. Jednakże, jeśli kompilator zrozumieć ukośnik w Fortran strun (GNU Fortran czy w przypadku korzystania z opcji -fbackslash), można napisać

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 

używa znaku ukośnika (\b), aby usunąć znaki wcześniej napisane na tej linii.

UWAGA: jeśli Twój kompilator nie rozumie advance="no", możesz użyć powiązanych niestandardowych trików, takich jak użycie specyfikatora $ w ciągu formatującym.

8

Następujące elementy powinny być przenośne w różnych systemach, używając kodu ACHAR(13) do kodowania powrotu karetki.

  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

Powinieneś używać znaczników [code /] (lub wcięć) do składni, aby podświetlić twój kod i uczynić go bardziej czytelnym. :) –

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

Ogólnie odpowiedzi są o wiele bardziej pomocne, jeśli zawierają wyjaśnienie, co kod ma zamiar zrobić i dlaczego rozwiązuje problem bez wprowadzania innych. (Ten post został zgłoszony przez co najmniej jednego użytkownika, prawdopodobnie dlatego, że uważał, że odpowiedź bez wyjaśnienia powinna zostać usunięta, a może "prawdopodobnie" podniosło ich hackles.) –

+0

To zasługuje na wyjaśnienie. Uwaga 'CARRIAGECONTROL =' nie jest zgodną z normą i ponownym otwarciem jednostki 6 (załóżmy, że jest to output_unit) może być trudne, szczególnie w przypadku niestandardowych specyfikatorów. Również Hollerity są usuwane z nowoczesnego Fortranu. Powinieneś wyjaśnić znaczenie "1H +" ". Ponadto, w standardowym Fortranie musisz używać 'I0', po prostu' I' nie jest dozwolone. –

0

następuje pracował doskonale pomocą G95 Fortran:

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

otrzymano: 5 PDF

pozostawiając kursor na pozycji # 1 na tej samej linii. Przy kolejnej aktualizacji, 5 zmieniło się w 10. ASCII 13 (dziesiętnie) to powrót karetki.

Powiązane problemy