Effacer les imprimés actuels de la console de ligne de
Comment puis-je effacer les imprimés actuels de la console de ligne de C? Je suis en train de travailler sur un système Linux. Par exemple -
printf("hello");
printf("bye");
Je veux imprimer bye sur la même ligne à la place de bonjour.
- La bibliothèque ncurses sera probablement faire. Je ne sais pas assez bien pour donner une réponse, mais voici des liens vers docs et une question connexe. Ce commentaire est basé sur Wil Shipley, en réponse à partir de 2009, ce qui peut être supprimé.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser VT100 codes d'échappement. La plupart des terminaux, y compris xterm, sont VT100 conscient. Pour effacer une ligne, c'est
^[[2K
. En C, cela donne:\r
est toujours nécessaire. Notez que l'utilisation de%c
n'est pas nécessaire. Alternative:printf("\33[2K\r");
printf("\r ");
.Vous pouvez utiliser un
\r
(retour chariot) pour ramener le curseur au début de la ligne:Cette impression sera bye sur la même ligne. Il ne sera pas effacer les caractères existants si, et parce que bye est plus courte que bonjour, vous allez vous retrouver avec byelo. Pour l'effacer, vous pouvez faire de votre nouveau d'imprimer plus de temps à remplacer les caractères supplémentaires:
Ou, effacez d'abord avec un peu d'espaces, puis imprimez votre nouvelle chaîne:
À imprimer bonjour, puis d'aller au début de la ligne et de les remplacer par des espaces, puis revenir au début de nouveau et d'impression bye.
La peine subtilités...
\33[2K
efface toute la ligne de votre curseur est actuellement sur\033[A
déplace le curseur d'une ligne vers le haut, mais dans le même colonne c'est à dire de ne pas le début de la ligne\r
apporte votre curseur au début de la ligne (r est pour le rewind) mais ne pas effacer quoi que ce soitDans un xterm plus précisément, j'ai essayé les réponses mentionnées ci-dessus et la seule façon que j'ai trouvée pour effacer la ligne et recommencer au début est la séquence (à partir du commentaire ci-dessus posté par @Stephan202 ainsi que @vlp et @mantal)
\33[2K\r
Sur une note mise en œuvre, pour le faire fonctionner correctement, par exemple dans un compte à rebours scénario, puisque je n'étais pas à l'aide d'un caractère de nouvelle ligne
'\n'
à la fin de chaque
fprintf()
, j'ai donc dûfflush()
le flux à chaque fois (pour vous donner le contexte, j'ai commencé à xterm l'aide d'une fourchette sur une machine linux sans rediriger stdout, je viens de l'écriture de la mémoire tampon pointeur de FICHIERfdfile
avec un non-bloquant descripteur de fichier que j'avais assis sur le pseudo-terminal adresse qui dans mon cas était/dev/pts/21
):Notez que j'ai utilisé à la fois le \33[2K séquence de supprimer la ligne suivie par le
\r
rewind séquence pour repositionner le curseur au début de la ligne. J'ai dûfflush()
après chaquefprintf()
parce que je n'ai pas un caractère de nouvelle ligne à la fin'\n'
. Le même résultat sans avoir besoin de fflush (), il faudrait séquence supplémentaire pour aller jusqu'à une ligne:Notez que si vous avez quelque chose sur la ligne immédiatement au-dessus de la ligne que vous voulez écrire sur, il s'en remettra-écrit avec la première fprintf(). Vous n'avez pas à quitter une ligne supplémentaire au-dessus pour permettre le premier mouvement d'une ligne:
\r
est l'abréviation de "retour chariot", pas "revenir en arrière", et est une relique de bonnes vieilles machines à écrire, qui avait séparé les opérations de "déplacer le curseur revenir à la première colonne" (\r
) et "l'avance de la page à la ligne suivante" (\n
).\33[2K
est un chemin à parcourir! La meilleure solution du problème pour moi. Fonctionne également sur Windows ConEmuVous pouvez supprimer la ligne à l'aide de \b
Habituellement, lorsque vous avez un '\r' à la fin de la chaîne, seul un retour chariot est imprimé, sans retour à la ligne. Si vous disposez des éléments suivants:
la sortie sera:
Une chose que je peux vous proposer (peut-être une solution de contournement) est une valeur NULL taille fixe chaîne de caractères qui est initialisé à tous les caractères d'espace, se terminant par un '\r' (à chaque fois avant de l'imprimer), puis utiliser la fonction strcpy pour copier votre chaîne (sans saut de ligne), de sorte que chaque impression ultérieurs va remplacer la chaîne précédente. Quelque chose comme ceci:
Vous pouvez faire la vérification des erreurs, de sorte que
my_string
est toujours au moins un de moins en longueur questr
, mais vous obtenez l'idée de base.i
parcourt char tableau de mots.j
conserve la trace de la longueur des mots."\b \b"
efface parole lors de la sauvegarde sur la ligne.Ce script est codé en dur pour votre exemple.
Cliquez ici pour source.
il y a un truc tout simple, vous pouvez travailler ici, mais il a besoin de préparation avant d'imprimer, vous devez mettre ce que jamais vous veut imprimer dans une variable et ensuite l'imprimer si vous connaissez la longueur de supprimer la chaîne.ici est un exemple.
Viens de trouver ce vieux thread, la recherche d'une sorte de séquence d'échappement à vide, la ligne réelle.
C'est drôle, personne n'est venu à l'idée (ou j'ai raté) qui printf renvoie le nombre de caractères écrits. Donc, il suffit d'imprimer '\r' + autant de caractères vides comme printf retourné et vous aurez exactement le vide previuosly texte écrit.
Que je ne peux utiliser VT100, il semble que je dois tenir à cette solution
Ce que la commande ci-dessus va faire :
Il permet d'imprimer bonjour et le curseur restera à "o" (à l'aide de \c)
Puis il faudra attendre 1 sec (sommeil 1)
Il remplacera bonjour à revoir.(à l'aide de \r)
NOTE : Using ";", We can run multiple command in a single go.
sous windows 10, on peut utiliser VT100 style en activant le mode VT100 dans la console actuelle d'utiliser les séquences d'échappement suivantes :
voir le lien suivant : windows VT100