Linux探秘坊-------4.进度条小程序

ops/2025/1/23 17:09:36/

1.缓冲区

#include <stdio.h>
int main()
{printf("hello bite!");sleep(2);return 0;
}

执行此代码后,会 先停顿两秒,再打印出hello bite,但是明明打印在sleep前面,为什么会后打印呢?

因为:

  • 在printf执行完了后,打印的内容被存到了缓冲区
  • 程序快结束时缓存区的内容再打印到显示器

奇妙的事情发生了:

#include <stdio.h>
int main()
{printf("hello bite!\n");sleep(3);return 0;
}

如果我们使用这样的代码,会 先打印出hello bite,再停顿两秒,为啥捏?

可以发现和上面的代码对比多了一个/n

  • 显示器有一种刷新策略,叫 行刷新
  • /n正好代表着换行,所以加了/n的内容会 直接从缓存区打印到显示器上不用等程序结束

那么我们有没有办法 不用\n也能先打印呢?
包有的:

#include <stdio.h>
int main()
{printf("hello bite!");fflush(stdout);sleep(3);return 0;
}
  • 这里的fflush(stdout)就起到了 刷新的作用

2.进度条(V1)

1.process.h

在这里插入图片描述

2.main.c

在这里插入图片描述

3.process.c(重点)

在这里插入图片描述

#include"process.h"2 #include<string.h>3 #include<unistd.h>4 5 #define size 101//需要考虑\0所以不是1006 #define style '#'7 8 void process()9 {10   int rate =0;11   char num[size];12   memset(num,0,sizeof(num));//这里是让num全部置空
W> 13   char* lable="|/-\\";//这里是模拟进度条后的圈圈14   int length=strlen(lable);15   while(rate<=100)16   {17     printf("[%-100s][%d%%][%c]\r",num,rate,lable[rate%length]);//100s是指预留100个字符,主要是为让】不动,但这样会导致倒着打印,所以需要加-,      \r是指每次打印完了之后都恢复到原位置18     fflush(stdout);//这里因为没有\n所以需要fflush进行刷新19     num[rate]=style;20     ++rate;21     usleep(50000);//usleep和sleep不同,前者单位是微秒 50000微秒=0.5秒22   }23 24   printf("\n");25 }  

3.进度条(V2)

1.process.h

在这里插入图片描述

2.process.c(重点)

在这里插入图片描述

void flushprocess(const char*tips, double total,double current)29 {30   const char *lable="|/-\\";31   int len =strlen(lable);32   static int index=0;33   char num[size];34   memset(num,0,sizeof(num));//将num置空35 36   double rate=current*100.0/total;//计算下载进度37   int n=(int)rate;//用下载进度确定有多少个#                                                                                                  38 39   int i=0;40   for(;i<n;i++)41     num[i]=style;//填充#到num中42 43   printf("%s...[%-100s][%.1lf%%][%c]\r",tips,num,rate,lable[index++]);//进度保留一位小数44   fflush(stdout);//因为没有使用\n,却又想直接刷新,所以需要fflush,记得包头文件#include<unistd.h>45   index %=len;46   if(n>=100)printf("\n");47 }

3.main.c(重点)

在这里插入图片描述

#include"process.h"3 #include<unistd.h>4 #include<time.h>5 #include<stdlib.h>6 7 typedef void (*call)(const char*, double,double);//定义函数指针类型8 9  10 11 double speed[]={5.0,0.5,0.3,0.02,0.1,0.01};//模拟网速的波动   12                                                               13 void download(int total,call cb)                              14 {                                                             15   srand(time(NULL));//设置种子                                16   double current =0.0;                                        17   while(current<=total)                                       18   {                                                           19     cb("下载中 ",total,current);                              20     if(current>=total)break;                                  21     int random=rand()%6;//随机匹配网速                        22     usleep(5000);                                             23     current+=speed[random];//加上每次下载的进度               24     if(current>=total)current=total;//有可能总和超过total,这样就没法显示100%,所以需要改为total25   }                                                           26 }                                                             27                                                               28                                                               29                                                               30                                                               31 int main()                                                    32 {                                                             33    download(1024.0,flushprocess);//传递文件大小和函数地址                                                                                      34    printf("下载 1024.0MB 完成\n");                                 35    download(512.0,flushprocess);                                   36    printf("下载 512.0MB 完成\n");                                  37    download(256.0,flushprocess);                                   38    printf("下载 256.0MB 完成\n");                                  39    download(128.0,flushprocess);                                   40    printf("下载 128.0MB 完成\n");                                  41                                                                    42    return 0;                                                       43 }     

效果如下:
在这里插入图片描述


http://www.ppmy.cn/ops/152513.html

相关文章

1.移动零

LeetCode 283. 移动零 1. 题目描述 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 注意&#xff1a;必须在 原地 对数组进行操作&#xff0c;不得额外分配新数组。 示例 示例 1: 输入: nums [0,1,0,3,1…

试题转excel;word转excel;大风车excel(1.1更新)

更新了大风车excel1.1版本 主要优化在算法层面&#xff1a; 1.0版本试题解析的成功率为95%&#xff0c;现在1.1版本已经优化到解析成功率为99% 一、问题描述 一名教师朋友&#xff0c;偶尔会需要整理一些高质量的题目到excel中 以往都是手动复制搬运&#xff0c;几百道题几…

HippoRAG:受海马体启发的长时记忆模型,提升大语言模型的知识整合能力

论文地址&#xff1a;https://arxiv.org/pdf/2405.14831 1. 背景与挑战 1.1 哺乳动物大脑与长时记忆 进化优势: 哺乳动物的大脑进化出强大的长时记忆系统&#xff0c;能够存储大量关于世界的知识&#xff0c;并不断整合新信息&#xff0c;同时避免灾难性遗忘。知识整合能力: …

代码随想录day15

110. 知道平衡二叉树的概念即可。 /** lc appleetcode.cn id110 langcpp** [110] 平衡二叉树*/// lc codestart /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nul…

AI赋能前端性能工程:突破技术边界,迈向智能化开发

前端性能工程对于用户体验至关重要。一个加载缓慢、反应迟钝的网站会直接导致用户流失&#xff0c;影响业务转化率。然而&#xff0c;在快速迭代的现代前端开发中&#xff0c;我们常常面临着效率瓶颈&#xff1a;代码冗余、资源加载缓慢、渲染性能低下等问题层出不穷。传统的手…

青少年CTF练习平台 PHP的XXE

访问靶场是个phpinfo()页面 题目提示是PHP的XXE&#xff0c;访问simplexml_load_string.php文件 get请求是空白&#xff0c;要使用post方法请求 尝试读取文件,读取/etc/passwd文件 <?xml version"1.0" encoding"utf-8" ?> <!DOCTYPE xxe [ &l…

Qt调用ffmpeg库实时播放rtmp或rtsp视频流

参考链接 https://blog.csdn.net/u012532263/article/details/102736700

并发任务管理:`submit()` 和 `invokeAll()` 的对比

并发任务管理&#xff1a;submit() 和 invokeAll() 的对比 在 Java 中&#xff0c;使用多线程执行并发任务是提高性能的常用手段。本文将深入探讨 submit() 和 invokeAll() 的使用场景、执行方式及其优缺点&#xff0c;并通过示例和对比帮助理解如何在实际开发中选择合适的方法…