Comment se débarrasser des caractères restants lors de l'utilisation de \ r en C ++?


John Sall

Supposons que j'ai le code suivant qui est un compteur infini:

#include <iostream>

int main() {

    short int counter = 0;

    while(true) 
        cout << "This is a counter: " << counter++ << " and I'll keep counting!\r";

    return 0;
}

Lorsque vous exécutez le code avec le retour chariot, il écrasera le texte existant, mais à la fin il y en aura plus d'un '!'. Y a-t-il un moyen de résoudre ce problème sans appeler l'écran clair pour éviter le scintillement?

David C. Rankin

Dans la continuité des commentaires ci-dessus, si vous sortez sur un terminal compatible VT (la plupart le sont), vous pouvez utiliser les séquences ANSI Escape pour contrôler l'effacement jusqu'à la fin de la ligne (et divers autres mouvements et visibilité du curseur).

Un court exemple de travail avec des lignes terminées par un retour chariot, que vous pouvez utiliser \033[Kpour effacer jusqu'à la fin de la ligne. (le nombre formel qui précède 'K'est "0K"mais peut être omis car il est la valeur par défaut) Les autres options d'effacement de ligne sont "1K"effacées jusqu'au début de la ligne et "2K"effacées toute la ligne. Vous pouvez également masquer et restaurer le curseur avec des échappements similaires.

Dans votre cas, vous pouvez gérer les caractères supplémentaires des lignes plus longues précédentes comme:

#include <iostream>
#include <unistd.h>

int main (void) {
    
    const char *lines[] = { "You do not ever want\r", 
                            "your favorite dog\r", 
                            "to have\r",
                            "fleas!\r" };
    int n = sizeof lines / sizeof *lines;
    
    std::cout << "\033[?25l";                   /* hide cursor */
    
    for (int i = 0; i < n; i++) {
        std::cout << "\033[0K" << lines[i];     /* clear to end, output line */
        std::fflush (stdout);
        sleep (2);
    }
    
    std::cout << "\033[?25h\n";                 /* restore cursor */
}

Compilez normalement et exécutez dans votre terminal. S'il est compatible VT, il traitera les échappements pour que vous voyiez chaque ligne imprimée sans qu'aucun des caractères supplémentaires de la ligne précédente n'interfère avec la sortie.

Articles connexes


Comptage des caractères restants lors de la saisie

RK Je veux écrire un programme qui calcule la longueur des caractères restants pendant que je tape dans la zone de texte mais le code ne fonctionne pas. Voici le code HTML: <!DOCTYPE html> <html lang="en"> <head> <title> </title>