\r终端输出的问题

文章详细介绍了如何在程序运行过程中显示进度条,并解决了当输出定向到文件时,使用 ' ' 控制符导致的乱码问题。通过将 std::cout 的输出绑定到文件流和使用 std::cerr 清洗进度条信息,实现了在终端和文件输出中都能正确显示进度条的效果。

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

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

 

so so,怎么解决呢?

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

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

 

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

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

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

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

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

 

 

 

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值