Modifying text in the terminal

后端 未结 4 1781
别跟我提以往
别跟我提以往 2021-01-14 08:54

Is it possible to modify text I printed to the terminal without clearing the screen?

For instance, if I\'m showing progress of something in percentage, can I modify

相关标签:
4条回答
  • 2021-01-14 09:15

    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.

    0 讨论(0)
  • 2021-01-14 09:15

    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 讨论(0)
  • 2021-01-14 09:26

    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;
    }
    
    0 讨论(0)
  • 2021-01-14 09:39

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

    0 讨论(0)
提交回复
热议问题