• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Linux新手小程序——进度条

武飞扬头像
RoseLJ
帮助1

前言

目录

前言


需要先了解        1.\r\n
                          2.缓冲区

一.理解字符的含义:

        学习c语言时,我们可以粗略把字符分为可显字符控制字符.

        在按回车换到下一行开始的操作时,实际上是进行了两个操作:1.让光标跳到下一行(只是垂直向下,这一步的操作称为换行).2.让光标跳到最开始的位置(此操作称为回车).

        即\r:回车 \n换行。

        而在c语言环境下把\n简化 其代表回车加换行。

测试\n,\r:

\n,\r都存在,既有回车又有换行,所以其linux的命令行在我们执行程序下面。学新通

学新通

只有\n

们在上面说了,这是我们在这个语言环境下我们将其简化,此时的\n就表示回车加换行。

\r \n都没有

linux命令就直接跟在文本行后面。

学新通

学新通

只有\r 

只有回车的效果,光标本来在文本行最后一个字符旁,回车后光标来到了文本行开始,最终导致文本被覆盖。 

学新通

学新通

 二,缓冲区的概念

  1.  
    #include<stdio.h>
  2.  
    #include<unistd.h>
  3.  
     
  4.  
    int main()
  5.  
    {
  6.  
    printf("hello world");
  7.  
    sleep(3);
  8.  
    }

运行上面代码会发现结果没有立马打印出来,这是因为数据在sleep期间被暂时保存起来。

但是如果加上\n,数据就会显示出来。————缓冲区有自己的行缓冲刷新策略。

三,小程序

1.倒计时小程序

  1.  
    1 #include<stdio.h>
  2.  
    2 #include<unistd.h>
  3.  
    3
  4.  
    4 int main()
  5.  
    5 {
  6.  
    6 int i=0;
  7.  
    7 for(i=9;i>=0;i--)
  8.  
    8 {
  9.  
    9 printf("%d\r",i);
  10.  
    10
  11.  
    11 sleep(1);
  12.  
    12 }
  13.  
    13 return 0;
  14.  
    14 }

我们利用\r覆盖的特性实现如上代码,但是结果倒计时却不显示,原因是数据存放在缓冲区里,缓冲区没有被刷新。我们将代码修改如下:

  1.  
    1 #include<stdio.h>
  2.  
    2 #include<unistd.h>
  3.  
    3
  4.  
    4 int main()
  5.  
    5 {
  6.  
    6 int i=0;
  7.  
    7 for(i=9;i>=0;i--)
  8.  
    8 {
  9.  
    9 printf("%d\r",i);
  10.  
    10 fflush(stdout);
  11.  
    11 sleep(1);
  12.  
    12 }
  13.  
    13 return 0;
  14.  
    15 }

以上代码我们会发现如果时间变成两位数,将只能覆盖一位数,因此修改为:

  1.  
    1 #include<stdio.h>
  2.  
    2 #include<unistd.h>
  3.  
    3
  4.  
    4 int main()
  5.  
    5 {
  6.  
    6 int i=0;
  7.  
    7 for(i=9;i>=0;i--)
  8.  
    8 {
  9.  
    9 printf("%-2d\r",i);
  10.  
    10 fflush(stdout);
  11.  
    11 sleep(1);
  12.  
    12 }
  13.  
    13 return 0;
  14.  
    15 }
  15.  
    ~
  16.  
     
学新通

2.进度条

进度条的预期样式:[#########################################] [0] [/]

    第一个括号是进度条 第二个括号是进度百分比 第三个是旋转图标 用于判断是否卡住。

编写

proc.h,编写进度条的头文件
proc.c,编写进度条的函数
main.c,测试进度条

proc.h

  1.  
    1 #pragma once
  2.  
    2
  3.  
    3 #include <stdio.h>
  4.  
    4
  5.  
    5 void process(); ~

main.c

  1.  
    1 #include "proc.h"
  2.  
    2
  3.  
    3 int main()
  4.  
    4 {
  5.  
    5 process();
  6.  
    6 return 0;
  7.  
    7 }

proc.c

  1.  
    1 #include"proc.h"
  2.  
    2 #include<unistd.h>
  3.  
    3 #include<string.h>
  4.  
    4
  5.  
    5 // "|/-\"旋转标志
  6.  
    6 void process()
  7.  
    7 {
  8.  
    8 const char* lable ="|/-\\"; //特殊字符\需要用\\
  9.  
    9
  10.  
    10 //为什们要定义101个字符?
  11.  
    11 //就是因为我们的进度条有100个
  12.  
    12 //但是字符的结尾要用\0表示所以我们要有101个字符
  13.  
    13 char bar[101];
  14.  
    14 //先将进度条设置为\0,然后在依次增加#。
  15.  
    15 memset(bar,'\0',sizeof(bar));
  16.  
    16 int i=0;
  17.  
    17 while(i<=100)
  18.  
    18 {
  19.  
    19 printf("[%-100s] [%d%%] [%c]\r",bar,i,lable[i%4]);
  20.  
    20 fflush(stdout);
  21.  
    21 bar[i ]='#';
  22.  
    22 usleep(100000);
  23.  
    23 }
  24.  
    24 printf("\n");
  25.  
    25
  26.  
    26 }
  27.  
     
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgbkfce
系列文章
更多 icon
同类精品
更多 icon
继续加载