\r终端输出的问题

来源:互联网 发布:linux jar 输出 编辑:程序博客网 时间:2024/05/21 17:22

近期偶一直在研究一个进度条的问题,具体要求是:

     程序在运行过程中要有进度显示,进度条需要根据时间不停的刷新,但是要求可以被其他的屏幕输出信息覆盖。

 

so so,怎么解决呢?

     研究了一下c/c++的输出控制,发现一个格式控制符'\r‘似乎可以满足需求。解决方法: 在输出进度条的时候不换行,下次输出信息时用 std::cout << '\r            ‘ 覆盖掉之前的进度条。

     小试了一下,问题貌似解决。微笑

 

但是,but,接下来出现了一个比较麻烦的问题。

      客户经常会通过管道等方式将屏幕输出定向到一个文件中去,而格式控制符'\r’在文件中是乱码,如何区分屏幕输出(终端)和文件输出呢?

      纠结了好久,老大的一句好拨开了云雾:使用std::cerr

           简单来讲,std::cout默认是终端输出,但是可以将它的rdbuf绑定到一个文件流上去,例如管道重定向。但是std::cerr只能绑定到终端输出。

      相应的调整了一下代码,利用std::cerr的特性来绑定终端输出的进度条代码,其余的默认输出。并且在每次输出其他信息的时候,调用 std::cerr << '\r            ‘ 来清洗之前的进度条信息。

 

 

 

     

0 0
原创粉丝点击