104 votes

Effacer la ligne actuellement affichée dans la console

Comment puis-je effacer la ligne actuellement imprimée dans la console en C ? Je travaille sur un système Linux. Par exemple -

printf("hello");
printf("bye");

Je veux afficher bye sur la même ligne à la place de hello.

3voto

Ashwin Points 1937

Habituellement, lorsque vous avez un '\r' à la fin de la chaîne, seul le retour à la ligne est affiché sans aucun saut de ligne. Si vous avez le code suivant:

printf("fooooo\r");
printf("bar");

la sortie sera:

barooo

Une chose que je peux suggérer (peut-être une solution de contournement) est d'avoir une chaîne de taille fixe terminée par NULL qui est initialisée avec tous les caractères d'espace, se terminant par un '\r' (à chaque fois avant l'impression), puis utiliser strcpy pour copier votre chaîne dedans (sans le saut de ligne), de sorte que chaque impression ultérieure écrase la chaîne précédente. Quelque chose comme ceci:

char str[MAX_LENGTH];        
// initialiser str avec tous les espaces, terminée par NULL avec le caractère comme '\r'
strcpy(str, my_string);       // copier my_string dans str
str[strlen(my_string)] = ' '; // effacer le caractère de fin de chaîne NULL
str[MAX_LENGTH - 1] = '\r';
printf(str);

Vous pouvez effectuer une vérification d'erreur pour que my_string ait toujours une longueur d'au moins un caractère de moins que str, mais vous comprenez l'idée de base.

2voto

Paul T Points 11

i parcourt le tableau de caractères des mots. j tient compte de la longueur du mot. "\b \b" efface le mot en reculant sur la ligne.

#include

int main()
{
    int i = 0, j = 0;

    char words[] = "Hello Bye";

    while(words[i]!='\0')
    {
        if(words[i] != ' ') {
            printf("%c", words[i]);
        fflush(stdout);
        }
        else {
            //system("ping -n 1 127.0.0.1>NUL");  //Pour Windows
            system("sleep 0.25");
            while(j-->0) {
                printf("\b \b");
            }
        }

        i++;
        j++;
    }

printf("\n");                   
return 0;
}

2voto

user320230 Points 80

Ce script est codé en dur pour votre exemple.

#include 

int main ()
{

    //écrire une entrée quelconque
    fputs("hello\n",stdout);

    //attendre une seconde pour changer la ligne précédente
    sleep(1);

    //supprimer la ligne
    fputs("\033[A\033[2K",stdout);
    rewind(stdout);

    //écrire une nouvelle ligne
    fputs("bye\n",stdout);

    return 0;
}

Cliquez ici pour source.

2voto

user2019716 Points 339

Sous windows 10 on peut utiliser le style VT100 en activant le mode VT100 dans la console actuelle pour utiliser des séquences d'échappement comme suit :

#include <windows.h>
#include <iostream>

#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004
#define DISABLE_NEWLINE_AUTO_RETURN  0x0008

int main(){

  // enabling VT100 style in current console
  DWORD l_mode;
  HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
  GetConsoleMode(hStdout,&l_mode)
  SetConsoleMode( hStdout, l_mode |
            ENABLE_VIRTUAL_TERMINAL_PROCESSING |
            DISABLE_NEWLINE_AUTO_RETURN );

  // create a waiting loop with changing text every seconds
  while(true) {
    // erase current line and go to line begining 
    std::cout << "\x1B[2K\r";
    std::cout << "wait a second .";
    Sleep(1);
    std::cout << "\x1B[2K\r";
    std::cout << "wait a second ..";
    Sleep(1);
    std::cout << "\x1B[2K\r";
    std::cout << "wait a second ...";
    Sleep(1);
    std::cout << "\x1B[2K\r";
    std::cout << "wait a second ....";
 }

}

voir le lien suivant : windows VT100

1voto

Aylian Craspa Points 21

Il y a un truc simple que vous pouvez travailler ici mais il faut préparation avant d'imprimer, vous devez mettre tout ce que vous voulez imprimer dans une variable et ensuite imprimer pour connaître la longueur à supprimer de la chaîne. Voici un exemple.

#include <iostream>
#include <string> //en fait, cette chose n'est pas nécessaire dans tdm-gcc

using namespace std;

int main(){

//créer une variable de type string

string str="Début du compte";

//boucle pour imprimer des chiffres

    for(int i =0;i<=50000;i++){

        //obtenir la longueur de la chaîne précédente et la effacer de l'écran avec le caractère de retour en arrière

        cout << string(str.length(),'\b');

        //créer une ligne de chaîne

        str="Début du compte " + to_string(i);

        //imprimer la nouvelle ligne au même endroit

        cout << str;
    }

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X