• 进度条——不仅仅是语言层面上的小程序


    \r和\n

    在老式键盘上,回车键是这样的形状image-20221120185636556

    但是该键的功能它不仅仅是回车,而是回车换行!

    这里需要明白两个概念:

    回车:光标移动到当前行的行首

    换行:光标移动到当前位置的下一行

    在C语言中,\r表示回车,而\n表示回车换行!

    做个测试:

    image-20221120190347886

    image-20221120190422601

    上面的第一张图,代码里写了两句输出函数,但是结果只显示了world,这是为什么?

    因为,我们的输出函数虽然会往屏幕上打印内容,但是该内容并不是立马执行到该语句就会打印的,而是printf函数会将内容先送往缓冲区,然后缓冲区里的内容在遇到一些标志的时候才会将该内容往屏幕上打印。

    上面第一张图,代码输出hello后紧接着又输出了\r,而此时若再不将缓冲区里的hello输出到屏幕中,那么当再有内容往缓冲区送时hello\r会和该内容一起往屏幕打印,在往屏幕打印的过程中,输出完hello后\r会将光标移动到行首h处,之后的内容将会从行首处开始往屏幕打印,导致覆盖掉hello,所以最终只会输出world。

    看下图能容易理解

    image-20221120192013051

    那么有什么办法能够使缓冲区里的内容及时往屏幕打印呢?

    \n可以,但会导致光标回车换行。

    这里有一个fflush函数,该函数可以使缓冲区里的内容及时往屏幕上打印。

    但这里要注意一点:该函数仅是刷新缓冲区里的内容往屏幕上打印,并不会解决\r之后会被覆盖的问题,该函数使得我们能够观察到hello输出到屏幕上,但无法解决hello会被world或者xxx覆盖的问题!

    image-20221120194029784

    image-20221120194040920

    由于程序运行的速度非常的快,所以我们在输出xxx之前用休眠函数先休眠10秒钟,这样我们就能够观察到hello输出的过程,当休眠结束后,xxx会从h处开始输出。

    进度条

    编写进度条的思想是:第一次输出一个#,第二次输出两个#,第三次输出三个#,……,每次输出都输出在同一行,这样就达到了进度条的效果!

    image-20221120194720192

    为了使进度条更加美观,我们在进度条后面可以加上百分比和旋转小图标

    image-20221120195028300

    完整代码

    #include 
    #include 
    int main()
    {
        char bar[101] = { '\0' };
        char* label = "-\\|/";
        for(int i = 0; i <= 100; ++i)
        {
            printf("[%-100s][%d%%][%c]\r", bar, i, label[i % 4]);
            bar[i] = '#';
            fflush(stdout);
            usleep(100000);
        }
        printf("\n");
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  • 相关阅读:
    软件测试/测试开发丨Web自动化—headless无头浏览器 学习笔记
    【小米】二维定长滑动窗口
    Go语言 包管理
    三、工厂方法模式
    WRFDA资料同化实践技术应用
    使用telnet+nc工具测试网络连通性
    java计算机毕业设计酒店预约入住系统源码+mysql数据库+系统+lw文档+部署
    2023中国计算机大会:蚂蚁集团连发两支百万级科研基金
    window10单机部署hbase-2.5.5-hadoop3
    深度学习神经网络协同过滤模型(NCF)与用户协同过滤(UCF)的区别
  • 原文地址:https://blog.csdn.net/qq_67569905/article/details/127953108