Lors de la création d'une application console Windows en C #, est-il possible d'écrire sur la console sans avoir à étendre une ligne actuelle ou à passer à une nouvelle ligne? Par exemple, si je veux afficher un pourcentage représentant la fin d'un processus, je voudrais juste mettre à jour la valeur sur la même ligne que le curseur, et ne pas avoir à mettre chaque pourcentage sur une nouvelle ligne.
Cela peut-il être fait avec une application console C # "standard"?
Réponses:
Si vous imprimez uniquement
"\r"
sur la console, le curseur revient au début de la ligne en cours et vous pouvez ensuite la réécrire. Cela devrait faire l'affaire:Remarquez les quelques espaces après le numéro pour vous assurer que tout ce qui était auparavant est effacé.
Notez également l'utilisation de
Write()
au lieu deWriteLine()
car vous ne voulez pas ajouter de "\ n" à la fin de la ligne.la source
PadRight
(enregistrer la chaîne non rembourrée, ou la longueur, d'abord, bien sûr).Vous pouvez utiliser
Console.SetCursorPosition
pour définir la position du curseur, puis écrire à la position actuelle.Voici un exemple montrant un simple "spinner":
Notez que vous devrez vous assurer d'écraser toute sortie existante avec une nouvelle sortie ou des blancs.
Mise à jour: Comme il a été critiqué que l'exemple ne déplace le curseur que d'un caractère en arrière, j'ajouterai ceci pour clarification: En utilisant,
SetCursorPosition
vous pouvez placer le curseur à n'importe quelle position dans la fenêtre de la console.placera le curseur au début de la ligne actuelle (ou vous pouvez utiliser
Console.CursorLeft = 0
directement).la source
SetCursorPosition
(ouCursorLeft
) permet plus de flexibilité, par exemple en n'écrivant pas au début de la ligne, en remontant dans la fenêtre, etc. c'est donc une approche plus générale qui peut être utilisée par exemple pour sortir barres de progression personnalisées ou graphique ASCII.Jusqu'à présent, nous avons trois alternatives concurrentes sur la façon de procéder:
J'ai toujours utilisé
Console.CursorLeft = 0
une variante de la troisième option, j'ai donc décidé de faire quelques tests. Voici le code que j'ai utilisé:Sur ma machine, j'obtiens les résultats suivants:
De plus, cela a
SetCursorPosition
provoqué un scintillement notable que je n'ai observé avec aucune des alternatives. Donc, la morale est d' utiliser des backspaces ou des retours chariot lorsque cela est possible , et merci de m'avoir enseigné un moyen plus rapide de le faire, SO!Mise à jour : dans les commentaires, Joel suggère que SetCursorPosition est constant par rapport à la distance parcourue alors que les autres méthodes sont linéaires. Des tests supplémentaires confirment que c'est le cas, mais le temps constant et lent est toujours lent. Dans mes tests, l'écriture d'une longue chaîne d'espaces arrière sur la console est plus rapide que SetCursorPosition jusqu'à environ 60 caractères. Ainsi, le retour arrière est plus rapide pour remplacer des parties de la ligne de moins de 60 caractères (ou plus), et il ne scintille pas, donc je vais m'en tenir à mon approbation initiale de \ b sur \ r et
SetCursorPosition
.la source
Vous pouvez utiliser la séquence d'échappement \ b (retour arrière) pour sauvegarder un nombre particulier de caractères sur la ligne actuelle. Cela déplace simplement l'emplacement actuel, il ne supprime pas les caractères.
Par exemple:
Ici, la ligne est la ligne de pourcentage à écrire sur la console. L'astuce consiste à générer le nombre correct de \ b caractères pour la sortie précédente.
L'avantage de ceci sur l' approche \ r est que si fonctionne même si votre pourcentage de sortie n'est pas au début de la ligne.
la source
\r
est utilisé pour ces scénarios.\r
représente un retour chariot ce qui signifie que le curseur revient au début de la ligne.C'est pourquoi Windows utilise
\n\r
comme nouveau marqueur de ligne.\n
vous fait descendre d'une ligne et\r
vous ramène au début de la ligne.la source
Je devais juste jouer avec la
ConsoleSpinner
classe de la divo . Le mien est loin d'être aussi concis, mais cela ne me convient pas que les utilisateurs de cette classe doivent écrire leur proprewhile(true)
boucle. Je vis pour une expérience plus semblable à celle-ci:Et je l'ai réalisé avec le code ci-dessous. Comme je ne veux pas que ma
Start()
méthode se bloque, je ne veux pas que l'utilisateur ait à se soucier d'écrire unewhile(spinFlag)
boucle semblable à celle-ci, et je veux autoriser plusieurs filateurs en même temps, j'ai dû générer un thread séparé pour gérer le filage. Et cela signifie que le code doit être beaucoup plus compliqué.De plus, je n'ai pas fait beaucoup de multi-threading, il est donc possible (probablement même) que j'aie laissé un ou trois bogues subtils. Mais cela semble assez bien fonctionner jusqu'à présent:
la source
Utiliser explicitement un retour chariot (\ r) au début de la ligne plutôt que (implicitement ou explicitement) utiliser une nouvelle ligne (\ n) à la fin devrait obtenir ce que vous voulez. Par exemple:
la source
la source
À partir des documents de la console dans MSDN:
Alors - je l'ai fait:
Ensuite, je peux contrôler moi-même la sortie;
Une autre façon d'y arriver.
la source
Cela fonctionne si vous voulez rendre la génération de fichiers cool.
Et c'est la méthode que j'ai obtenue d'une réponse ci-dessous et l'ai modifiée
la source
En voici un autre: D
la source
Si vous souhaitez mettre à jour une ligne, mais que les informations sont trop longues pour s'afficher sur une seule ligne, il peut avoir besoin de nouvelles lignes. J'ai rencontré ce problème et voici une façon de résoudre ce problème.
la source
je cherchais la même solution sur vb.net et j'ai trouvé celle-ci et elle est géniale.
cependant, comme @JohnOdom a suggéré une meilleure façon de gérer l'espace des blancs si le précédent est plus grand que celui actuel.
je fais une fonction dans vb.net et pensais que quelqu'un pourrait être aidé ..
voici mon code:
la source
Static intLastLength As Integer
.Je faisais une recherche pour voir si la solution que j'avais écrite pouvait être optimisée pour la vitesse. Ce que je voulais, c'était un compte à rebours, pas seulement la mise à jour de la ligne actuelle. Voici ce que j'ai trouvé. Pourrait être utile à quelqu'un
la source
Inspiré par @ E.Lahu Solution, mise en place d'une barre de progression avec pourcentage.
la source
Voici mon point de vue sur les réponses de soosh et 0xA3. Il peut mettre à jour la console avec des messages utilisateur lors de la mise à jour du spinner et dispose également d'un indicateur de temps écoulé.
l'utilisation est quelque chose comme ceci:
la source
La
SetCursorPosition
méthode fonctionne dans un scénario multi-thread, où les deux autres méthodes ne le font pasla source