• 原地更新终端输出信息


    前言

    有时我们需要更新同一行输出信息,而不是输出新行,如进度显示。两种实现方法:

    1. 输出退格符  ,清除该行输入字符
    2. 输出回车符 ,然后覆盖已输出的字符

    对于第1种实现,该行已输出多少字符,需要刚好输出 相同数量 的  ,以防止某些终端实现把上一行的回车也吃掉了。可使用 printf() 的返回值得到已输出字符数。

    对于第2种实现,输出的新字符数量必须 不少于 已输出的,以完全覆盖之前的输出。

    本人更倾向于第2种实现,只要保证每行输出的字符数量相同(通过 printf() 指定参数的输出字符数),实现更简洁、维护性更好。

    本文分别给出C语言和Shell的实现例子。

    C语言实现

    perl">
    c#include <stdio.h>
    #include <unistd.h>
    int main(void) 
    {
      int i;
      for (i = 0; i < 100; i++) {
        printf("
    progress: %3d%%", i);
        fflush(stdout);
        sleep(1);
      }
      printf("
    ");
      return 0;
    }
    
    

    需要特别注意的是,终端设备是 行缓冲 设备,即除非输出换行符   或缓冲区已满,否则 printf() 不会有任何输出;所以这里需要使用 fflush(stdout) 消除标准输出缓冲区,以立即输出缓冲区内容。

    Shell实现

    bash#!/bin/bash
    for i in {1..100}
    do
      echo -ne "
    progress: $i%"
      sleep 1
    done
    # print a new line
    echo
    
    

    其中 -n 参数令echo不输出换行, -e 参数令其解释   为回车符(回到行首)。

  • 相关阅读:
    ZOJ 2158 Truck History
    Knight Moves (zoj 1091 poj2243)BFS
    poj 1270 Following Orders
    poj 2935 Basic Wall Maze (BFS)
    Holedox Moving (zoj 1361 poj 1324)bfs
    ZOJ 1083 Frame Stacking
    zoj 2193 Window Pains
    hdu1412{A} + {B}
    hdu2031进制转换
    openjudge最长单词
  • 原文地址:https://www.cnblogs.com/bokejiayuan/p/4249955.html
Copyright © 2020-2023  润新知