Comment faire pour restaurer les lignes de cout?
Je suis codage d'une tâche de surveillance, les mises à jour des tâches de progrès à l'aide de cout. J'aimerais afficher une progression de la tâche par ligne, j'ai donc à la restauration de plusieurs lignes de la console.
J'insiste sur "plusieurs" parce que \b
fait le travail pour une ligne, mais n'efface pas \n
entre les lignes.
J'ai essayé std::cout.seekp(std::cout.tellp() - str.length());
mais tellp()
retourne -1 (échec).
Vous ne pouvez pas.
Pourquoi avez-vous même voulez effacer de la liste des tâches terminées? Il suffit d'imprimer une progression de la tâche élément par ligne, et il va jouer encore mieux si quelqu'un exécute votre programme et tuyaux stdout dans un fichier journal.
Je sais, mais il y aura UN grand nombre de lignes, je ne veux pas noyer l'utilisateur dans le cadre d'infos, juste lui donner un statut, et le pourcentage d'avancement de chaque tâche que je suis en cours d'exécution.
cout
ne représente pas la console. Il représente un flux de sortie. Cela signifie que vous pouvez écrire, mais vous ne pouvez pas faire quelque chose à propos de ce qui a déjà été écrit. cout
est pour l'impression de sortie quel que soit le périphérique de sortie de la plate-forme utilise (par exemple, mais pas nécessairement, une fenêtre de console). Si vous avez besoin de manipuler la console en particulier, vous devez utiliser un système d'exploitation spécifique de la bibliothèque qui sait à propos de la fenêtre de la console.Pourquoi avez-vous même voulez effacer de la liste des tâches terminées? Il suffit d'imprimer une progression de la tâche élément par ligne, et il va jouer encore mieux si quelqu'un exécute votre programme et tuyaux stdout dans un fichier journal.
Je sais, mais il y aura UN grand nombre de lignes, je ne veux pas noyer l'utilisateur dans le cadre d'infos, juste lui donner un statut, et le pourcentage d'avancement de chaque tâche que je suis en cours d'exécution.
OriginalL'auteur Mister Mystère | 2010-07-18
Vous devez vous connecter pour publier un commentaire.
Vous pouvez faire
cout << '\r';
de sauter au début de la ligne courante, mais une tendance à la hausse est spécifique au système. Pour Unix, voirman termcap
etman terminfo
(et de recherche pourcursor_up
). Sur ANSI-terminaux compatibles (comme la plupart des terminaux modernes disponibles sur Unix), cela fonctionne pour déplacer vers le haut:cout << "\e[A";
.N'essayez pas de chercher dans
cout
, c'est unseekable la plupart du temps (sauf quand redirigé vers un fichier).Comme mentionné dans d'autres réponses, à l'aide de la ncurses (ou argot) bibliothèque fournit une bonne abstraction pour le terminal d'e/S sur Unix.
Au lieu de le remplir avec des espaces (qui est sujette à erreur, parce que pas chaque terminal est de 80 caractères de large), vous pouvez le faire
\r
+clr_eol
:std::cout << "\r\e[K" << std::flush
.J'avais besoin de
<< std::flush
trop pour obtenir l'affichage de manière interactive.Au lieu de le remplir avec des espaces (qui est sujette à erreur, parce que pas chaque terminal est de 80 caractères de large), vous pouvez le faire
\r
+clr_eol
:std::cout << "\r\e[K" << std::flush
. Mise à jour de ma réponse.OriginalL'auteur pts
Utiliser un formatage de sortie de la bibliothèque comme ncurses si vous le pouvez, ce qui simplifie le terminal de manipulation de manière significative.
OriginalL'auteur You
Ni C ni C++ définir quelque chose comme ça. Vous avez besoin explicite terminal de manipulation. Sous Unix, vous pouvez utiliser les malédictions. N'ont aucune idée de ce qui est là pour de Windows.
OriginalL'auteur Nikolai Fetissov
Je sais que c'est un vieux post, mais le a accepté de ne pas couvrir les cas où le cout est canalisée vers un programme ou un fichier et c'est le top de mes recherches sur google. Le suivant va gérer à la fois courante et non courante stdout avec un comportement légèrement différent.
Ce n'est pas testé sur windows, mais devrait fonctionner. Ce qu'il fait est de détecter si le descripteur de fichier ou est un tty. Si c'est juste écrit "\r " si l'encaissement n'a pas changé depuis la dernière fois qu'il a imprimé ou un saut de ligne. Si ce n'est pas un retour à la ligne, il cherche à la dernière place c'est après l'imprimer.
Il se comporte différemment pour les fichiers que pour les ats. Pour un fichier, si quelque chose de sorties pour les flux entre les impressions, alors il peut remplacer certains ou la totalité de ce qui a été écrit, même après les retours à la ligne. Pour les ats juste remplace les caractères au début de la ligne courante.
OriginalL'auteur Erroneous
J'espère que ça aide 😉 [Il devrait fonctionner sur Linux.]
OriginalL'auteur Alex Xu