C语言实现在控制台同一行覆盖刷新输出,以及'\b'退格控制字符的使用

来源:互联网 发布:程序员之死 知乎 编辑:程序博客网 时间:2024/06/05 02:35

声明

本文参考自CSND博客实现Linux下带进度显示的cp命令 - xcp。
本文结构目录如下:

  • 声明
  • 在控制台同一行覆盖刷新输出的技术
  • C语言中b退格字符的使用方法以及原理
  • 总结


在控制台同一行覆盖刷新输出的技术

  • 缘起
    之前编程遇到过需要覆盖刷新输出的,但是终究没有找到解决办法,关于这个的介绍真的是太少了。
    今天在进行Linux下的文件复制的时候,复制了一个文件夹,大小是98.8GB。这复制起来,可真的是废了时间了。我用的是Linux环境中自带的cp命令,这个命令在执行的时候,按了回车键就什么反应的没有了,根本看不出来到底有没有在复制,也看不出来任何复制进度,真的让人很着急。于是在网上百度到了上面介绍的博文内容,该博主自己写了一个复制命令,带有复制进度提示,很实用,并且在同一行进行覆盖刷新输出进度信息,这样看起来就美观多了。
  • 什么是同一行覆盖刷新?
    当我们在进行编程的时候,经常会遇到需要在控制台(命令行窗口)中进行字符以及字符串的输出,尤其是在LinuxC/C++编程中,十分普遍。普通的输出中,我们用printf函数进行输出,每次输出一行之后,在输出其他内容的时候,总是换行进行输出,原来的那一行还是存在的。如果看起来很不美观,尤其是在控制台进行下载、复制、剪切等操作的时候,用输出文字信息进行提示。但是如果输出一行,然后在下一行进行输出的话,就会像Linux下的强大的下载工具wget一样,输出很多行,看起来太丑。
    本文介绍的方法,可以在输出一条提示信息之后,将刚刚输出的这一行信息删除,然后再重新输出。
  • 具体做法
    • 在控制台输出一行信息:printf(“这是第一次输出。”);
    • 然后用字符串”\r\033[k”字符串删除刚刚的输出信息。
      在Linux+GCC环境的时候,用:printf(“\r\033[k”);
      在Windows+Dev-C++环境的时候,用:printf(“\r”);
    • 编程的时候,间隔一点时间(负责刷新太快,看不到前面的输出),输出下一信息:printf(“这是第二次输出。”)
  • 示例
    大家可以编写一个简单的小程序,测试一下就可以看到具体的效果了。
    • Linux+GCC下
int j=0,i=0;    while(j++<10)    {               printf("这是第%d次输出------",j);               for(i=0;i<1000000000;i++);               printf("\r\033[k");     }
  • windows+Dev-C++
 int j=0,i=0;    while(j++<10)    {               printf("这是第%d次输出------",j);               for(i=0;i<1000000000;i++);               printf("\r");     }

读者可根据自己具体的环境,斟酌选用以上两者。

  • 在Linux系统和在Windows系统中字符’\r’和’\n’的作用是不同的。可能因此导致了以上的两点不同。

C语言中’\b’退格字符的使用方法以及原理

  • 缘起
    在C语言中,提供了转义字符’\b’来进行输出后的退格操作。在编程过程中,我们有时候需要进行退格操作。但是,我在以前使用的过程中,发现我使用语句printf(“abc\b”);之后,在输出结果中还是显示的abc并不是我希望得到的ab。
  • 具体做法以及原理
    在用’\b’进行退格操作的时候,实际上,每次使用’\b’字符之后,控制台的输出光标会后退一个字符的位置,但是并没有将相应的字符删除。所以,我们需要在’\b’字符后面紧跟一个字符,用来代替需要删除的字符。如果后面没有需要输出的字符,可以用至少一个空格跟在’\b’后面,用来替换需要删除的字符。
    该’\b’退格字符,也可以多个连用,以实现对多个字符的删除操作,但是需要注意的是,想要删除几个字符就要使用至少几个’\b’,对应的也需要有相等数量的字符用来替换待删除的字符。
  • 示例
    • 对单个字符进行退格操作(删除单个字符)
printf("abc\bv");  //此处的输出结果是abv,后面的'v'就是用来替换'c'的字符printf("abc\b");  //此处的输出结果是abc,可以看出虽然用了'\b'退格,但是并没有提供相应的用来替换最后一个字符'c'的字符printf("abc\b ");  //此处的输出结果是ab,因为在'\b'后面,跟了一个空格' '来替换了字符'c'
  • 对多个字符进行退格操作(删除字符串)
printf("phrase\b\b\b\b.new");  //此处的输出结果是ph.new,后面的字符串".new"是用来替换"rase"printf("phrase\b\b\b\b  newString");  //此处输出的结果是ph  newString,中间用了两个空格来代替字符串"ra",紧接着用了两个字符"ne"来代替字符串"se",再后面多出的"wString"字符串,则原样输出
  • 补充
    对于’\b’的退格字符,似乎还没有什么一致的标准。可能不是所有地方都是如此。

总结

以前在需要使用这两种技巧的时候,都没有找到解决的办法,尤其是前者。今天无意之中找到了解决办法,就在晚上把它写出来,供大家以后能方便地找到。尤其是C语言编程中,在控制台同一行覆盖刷新输出信息,关于这个技巧在网上我只找到了实现Linux下带进度显示的cp命令 - xcp这一篇涉及到的文章,也只是稍微提了一下。本文专门总结出来,供大家查阅。
感谢CSDN博主lightd的文章。也欢迎大家转载本文(转载请注明出处)。


以上内皆为本人请自验证。
如有疑问,请发送邮件至1993wbb@sina.cn或者加QQ群274313939寻求解答


1 0
原创粉丝点击