开发者

Modifying text in the terminal

开发者 https://www.devze.com 2023-03-25 23:26 出处:网络
Is it possible to modify tex开发者_Python百科t I printed to the terminal without clearing the screen?

Is it possible to modify tex开发者_Python百科t I printed to the terminal without clearing the screen?

For instance, if I'm showing progress of something in percentage, can I modify that percentage without having to clear the screen and printing again? I'm looking for a cross-platform way, if there is one.

Talking C++.

thanks


There are a number of ways to do this, and depending on how much effort you want to put into it, you can do a lot of cool things with ascii text in a terminal window.

  1. Advanced: ncurses library

  2. Easier: ansi escape characters with printf or cout

  3. Easiest: As others have said, simply use \r for a carriage return without a linefeed.

Edit: example of using the ESC sequence to go back two characters:

#include <iostream>
#define ESC char(0x1B)

int main(){
  std::cout << "This will overwrite 'rs' in the following: characters" << ESC << "[2D" << "xx" << std::endl;
  return 0;
}


A very simple way to do it is to print out a string followed by a '\r' character. That is carriage return by itself and on most consoles, it returns the cursor to the beginning of the line without moving down. That allows you to overwrite the current line.

If you are writing to stdout or cout or clog remember to fflush or std::flush the stream to make it output the line immediately. If you are writing to stderr or cerr then the stream is unbuffered and all output is immediate (and inefficient).

A more complicated way to do it is to get into using a screen drawing library like curses.


On Linux systems, check out the ncurses package. This package provides support for cursor movement on most terminals.


You can use the "\r" character to return to the first character of that line:

for(int i = 0; i < 60; i++){ cout << "\rValue of i: " << i;}

Keep in mind to NOT put an end line (endl or '\n') at the end of your output, or you'll just skip to the beginning of the new line each time, losing that desired effect.

0

精彩评论

暂无评论...
验证码 换一张
取 消