Comment définir la position du curseur de la console pour stdout

Je veux définir la position du curseur pour imprimer un caractère sur l’écran de la console. Existe-t-il une solution sans utiliser la bibliothèque ncurses ?

Existe-t-il un appel équivalent pour SetConsoleCursorPosition sous Linux à partir de l’ exemple ci-dessous:

 void print (int x, int y, char c) { COORD p = { x, y }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), p); printf("%c", c); } 

Peut-être un peu d’histoire est en ordre. Ce que vous appelez la «console» dans Windows est en réalité un exemple d’émulateur de terminal. Toutefois, contrairement aux émulateurs de terminal traditionnels, Windows fournit un access direct au terminal via son API de console. L’approche traditionnelle adoptée par les terminaux (et donc par les émulateurs de terminal) consistait à interpréter les séquences d’échappement , chacune d’elles ordonnant au terminal d’effectuer certaines opérations.

Malheureusement, comme vous pouvez l’imaginer, les capacités des terminaux varient considérablement (certains peuvent même dessiner des graphiques d’une sorte ou d’une autre) et tous les terminaux n’utilisent donc pas le même ensemble de séquences d’échappement. De nos jours, vous seriez très malchanceux de rencontrer quelque chose qui n’aurait pas implémenté un sur-ensemble des fuites ANSI / VT100 ; si vous ne souhaitez que prendre en charge que la norme ANSI / VT100 et ses dérivés, vous pouvez envoyer ESC [ n ; m H ESC [ n ; m H , où n est le numéro de la ligne et m le numéro de la colonne.

Cependant, si vous faites cela, votre code ne fonctionnera pas s’il est présenté avec quelque chose d’exotique. Dans ce cas, vous devriez vraiment envisager d’utiliser une bibliothèque curses (ncurses étant un exemple courant, mais pas unique), même si vous ne l’utilisez que pour extraire des informations de la firebase database terminfo (bien que je vous recommande fortement d’utiliser simplement les curses bibliothèque).

Enfin, une remarque: le code que vous citez à partir de Windows ne fonctionnera pas nécessairement (!) Pourquoi? Parce que printf() crée une sortie en mémoire tampon et qu’il n’ya aucune garantie que votre personnage sera envoyé à la console avant que vous ne modifiiez à nouveau la position du curseur. Vous pouvez résoudre ce problème en utilisant fflush(stdout) , mais honnêtement, si vous utilisez SetConsoleCursorPosition vous pouvez aussi bien utiliser WriteConsole et en WriteConsole .

Informations utiles supplémentaires

Vous pouvez réellement obtenir une version de curses fonctionnant sous Windows; voir par exemple PDCurses . Si vous utilisiez des malédictions, vous n’auriez pas non plus besoin de code spécifique à Windows, et vous utiliseriez n’importe quel terminal utilisé.