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.
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.
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.
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;
}
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.
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
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 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.