8
votes

Comment formater une instruction d'impression ou d'écriture pour écraser la ligne actuelle sur l'écran de la console?

Je veux afficher la progression d'un calcul effectué avec une boucle DO-boucle, sur l'écran de la console. Je peux imprimer la variable de progression du terminal comme ceci: xxx

La sortie du code ci-dessus sur l'écran de la console est la suivante:

10.00 20.00 30.00 40.00 50.00 60.00 70.00 80.00 90.00 100,00

Tout sur la même ligne, enveloppé uniquement par la fenêtre de la console.

L'avance "non" < fort> tl10 (onglet laissé tant d'espaces) Modifier le descripteur fonctionne bien pour écraser le texte sur la même ligne, par exemple La sortie du code suivant: xxx

est:

500

au lieu de: < / p>

100 500

en raison du descripteur d'édition TL4.

à partir de ces deux instances, on peut conclure que la déclaration d'écriture ne peut pas écraser quoi a été écrit par une autre déclaration d'écriture ou par une exécution antérieure de la même satire d'écriture (comme dans une boucle do-boucle).

peut-il être surmonté d'une manière ou d'une autre?

J'utilise le Compilateur FTN95 sur Windows 7 RC1. (Le programme d'installation du compilateur G95 BluesCreens Windows 7 RC1, a même pensé que cela fonctionne bien sur Vista.)

Je sais sur la question Suspressing Line Breaks in Fortran 95 Écrire des déclarations , mais cela ne fonctionne pas pour moi, car la réponse à cette question signifie que la nouvelle iPVOut est ajoutée à la sortie précédente sur la même ligne; Au lieu de nouvelle sortie écraser la sortie précédente.

Merci d'avance.


3 commentaires

Quel compilateur et système d'exploitation êtes-vous?


@DigitalRoss, Compiler = FTN95, OS = Windows 7 RC1


Peut-être que vous devriez accepter une réponse?


4 Réponses :


3
votes

Il n'y a pas de solution à cette question dans le cadre des normes FORTRAN. Toutefois, si votre compilateur comprend la barre oblique inverse des chaînes de Fortran (GNU FORTRAN fait si vous utilisez l'option -fbackslash ), vous pouvez écrire xxx

ceci utilise le caractère barre-backslash ( \ b ) pour effacer les caractères précédemment écrits sur cette ligne.

nb: Si votre compilateur ne comprend pas avancée = "non" , vous pouvez utiliser Trucs non standard associés, tels que l'utilisation du spécificateur $ dans la chaîne de format.


2 commentaires

Comme le dit le Dr Fortran m'a signalé à Ce fil , si Vous utilisez c_backspace à partir du module iso_c_binding , vous n'avez pas besoin d'options de compilateur spéciales. La commande write serait répéter (c_backspace, 3) // "gee" au lieu de "\ b \ b \ bgee" .


De plus, si vous utilisez ifort , vous devrez appeler flush après chaque commande écrire .



13
votes

Les éléments suivants doivent être portables sur des systèmes à l'aide de ACHAR (13) code> pour coder le retour du chariot.

          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)


1 commentaires

Vous devez utiliser les balises [code /] (ou indenter) à la syntaxe mettez en surbrillance votre code et le rendre plus lisible. :)



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

2 commentaires

Généralement, les réponses sont beaucoup plus utiles s'ils incluent une explication de ce que le code est destiné à faire et pourquoi cela résout le problème sans introduire d'autres personnes. (Ce message a été signalé par au moins un utilisateur, probablement parce qu'ils pensaient qu'une réponse sans explication devrait être supprimée. Ou peut-être que "probablement" leva leurs hackles.)


Cela mérite une explication. Remarque carriagecontrol = n'est pas une unité de conformité et de réouverture standard 6 (supposons qu'il s'agit de la sortie_unit) peut être délicate, en particulier avec des spécificateurs non standard. De plus, les hollérithes sont supprimés de Modern Fortran. Vous devez expliquer la signification du le 1H + "" . De plus, dans la standard fortran, vous devez utiliser i0 , juste i n'est pas autorisé.



1
votes

Les suivants ont parfaitement fonctionné à l'aide de G95 FORTRAN:

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


0 commentaires