当前位置: 首页 > news >正文

山东建设和城乡建设厅注册中心网站驾校视频网站模板

山东建设和城乡建设厅注册中心网站,驾校视频网站模板,h5开发入门,南宁会员网站制作前言 已经学习了linux下基本工具的使用,现在来实践练习一下。 1.回车和换行 在Windows下,我们认为回车换行是一个概念;但事实上,换行就是换到下一行的当前位置,而回车是回到当前行的开头位置。 我们之所以会认为回车…

前言

已经学习了linux下基本工具的使用,现在来实践练习一下。

1.回车和换行

Windows下,我们认为回车换行是一个概念;但事实上,换行就是换到下一行的当前位置,而回车是回到当前行的开头位置。

我们之所以会认为回车和换行是一个概念,那是因为在我们使用\n的时候,它做了回车和换行两个操作。

现在来看linux下这样两段代码

#include<stdio.h>
int main()
{printf("迟来的grown\n");return 0;
} 
#include<stdio.h>
int main()
{printf("迟来的grown\n");return 0;
} 

在这里插入图片描述

可以看到\n\r的不同,但运行结果就不一样,其中\r就是表示回车;

那为什么\r回车就没有显示出来结果呢?

这里就要了解缓冲区这个东西了。

缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。

我们可以大致理解为在输入输出时,并不是一个一个字符来进行的(部分特殊除外),这里是行缓冲区。

行缓冲:当输入和输出时,遇到换行符,才执行真正的I/O操作。这时我们输入的字符就会先存放在缓冲区,当按下回车键才进行实际的I/O操作。典型的就是stdinstdout

行缓冲,输出时要遇到换行符才执行真正的输出;所以\r回车,输出的内容就存放在了缓冲区,在程序结束时才清空缓冲区。

这里看两段代码

#include<stdio.h>
int main()
{printf("迟来的grown\n");sleep(3);return 0;
} 
int main()
{printf("迟来的grown");sleep(3);return 0;
} 

这里运行结果:(看到的)

  • 第一段代码先输出了迟来的grown,然后再休眠了3
  • 第二段代码休眠了3秒,在程序结束时才输出了迟来的grown

这两段代码的差别就是\n,这也证明行缓冲区,遇到换行刷新缓冲区的内容。(在程序结束时,也会刷新缓冲区内容)

看到这里可能有疑问,既然程序结束后也会刷新缓冲区的内容,那为什么使用\r在程序结束后也没有输出结果啊?

这是因为linux中它要输出命令行信息,在程序执行完之后,光标是在行开头的,命令行信息就覆盖了要输出的内容。

那我们能不能进行一些操作来看到要输出的内容呢?

当然是有的,我们可以使用fflush来刷新缓冲区(stdout)的内容。

int main()
{printf("迟来的grown");fflush(stdout);sleep(3);return 0;
} 

以上代码运行结果

输出了迟来的grown,再休眠了3秒,最后程序结束;命令行信息将输出内容覆盖了。

2.倒计时程序

了解了回车换行,现在我们来简单些一个倒计时程序。

#include<stdio.h>int main()
{int count =10;while(count){printf("%-2d\r",count);fflush(stdout);count--;sleep(1);}
}

代码如上,这里可能出现的一些问题

  • 输出时只覆盖了第一个数字:使用%2d/%-2d,我们要让数字占两个数字(字符)的位置。
  • 程序运行不显示倒计时:使用fflush刷新缓冲区内容。

3.进度条程序

在进行编写第一个linux程序——进度条之前,我们先重温一下makefile

BIN=progress
SRC=$(shell ls *.c)
OBJ=$(SRC:.c=.o)
CC=gcc
RM= rm -rf$(BIN):$(OBJ)$(CC) -o $@ $^
%.o:%.c$(CC) -c $<
.PHONY:
clean:$(RM) $(OBJ) $(BIN)
  • 首先shell ls *.c,获得当前目录下所有的.c文件,可以使用wildcard *.c
  • SRC:.c=.o,将SRC中所以的.c后缀改为.o
  • $@$^$@是获取依赖文件列表,$^获取目标文件。
  • $<,是将依赖文件列表拿出来逐个执行。

更加详细的make/makefile,深入了解Linux —— make和makefile自动化构建工具_linux makeself-CSDN博客

好现在,我们正式开始写linux下的第一个程序——进度条

先来看一下我们要实现的进度条是什么样的:

进度条程序

在这里插入图片描述

我们想要看到的进度条是,进度一直在增加,百分比一直在上涨,最后的方框内一直在转圈。

那该如何实现呢?

首先先来看一下需要写哪些文件

在这里插入图片描述

这里呢,写了四个文件

  • makefile文件
  • code.c:程序主函数main所在的文件
  • progress.c:进度条程序的代码源文件
  • progress.h:进度条程序的代码头文件

了解了这些,现在来看我们如何实现呢?

这里虽然我们看起来是进度条连续增加的,但是事实上就是一次一次输出的结果。

不知道你是否还记得在实现贪吃蛇小游戏的时候,我们就是一次次输出,来实现蛇的移动;这里也同理,我们依然一次次打印来达到我们预期的效果。

某一时刻进度条的输出

我们先来看某一时刻进度条是如何输出的;

假设现在我们正在下载一个软件,软件大小1024.00MB ,我们当前下载了512.00MB,那如何打印这一时刻的进度条呢?

void process()
{double total = 1024.00;//下载总量double current = 512.00;//当前下载量int rate = (int)(current*100)/total;//进度条百分比,也是要打印`=`的数量const char* str = "|-/\\";//表示最后方框内旋转的字符,最后一个\\转义字符static int cnt =0;//表示当前应该那个字符,来转圈char buff[101]={'\0'};int i=0;for(i=0;i<rate;i++){buff[i]='=';}printf("[%-100s][%d%%][%c]\n",buff,rate,rate[cnt]);
}

在这里插入图片描述

可以看到在一时刻的进度条就已经成型了;那我们根据先已经写好的代码,来实现完整的进度条。

进度条实现

  • 我们知道了这一时刻的进度条如何打印,那我们之间让current当前进度累加即可(这就涉及到一个速度问题)。
  • 还有一点,最后方框内如何让它转动起来

为了控制速度,我们既可以控制current累加的值,当然也可以控制休眠时间usleep

为了控制方框内转动,我们定义一个静态常量,来决定应该输出哪一个字符。

具体代码如下


#include"progress.h"
#include<unistd.h>
#include<string.h>
#define NUM 101
#define CH '='
void process()
{char buff[NUM];memset(buff,0,sizeof(buff));const char* str="|/-\\";int len = strlen(str);int cnt =0;while(cnt<=100){printf("[%-100s][%d%%][%c]\r",buff,cnt,str[cnt%len]);fflush(stdout);buff[cnt]=CH;usleep(10000);cnt++;}printf("\n");
}

这里curremt增加量和usleep休眠时间可以自行修改。

对于这个版本,感觉还是差点意思如果我们需要下载内容,大小不一,下载网速也不同,那该如何?

这个进度条我们只有修改这个函数内的数值才能控制进度条的快慢,我们还可以进行修改,通过传参来控制总量。

这里提供修改后的版本,细节就不详细讲解了。

当然这个版本也存在一些不足之处,有待提高。

code.c

#include"progress.h"
#define speed 1.0
void Download(double total)
{double current=0;while(current<=total){Process(total,current);usleep(6000);current+=speed;}    printf("\ndownload %lfMB Done\n",total);
}
int main()
{//process();Download(1024.00);return 0;
}

progress.h

#include<stdio.h>
#include<unistd.h>
void Process(double total, double current); 

progress.c

void Process(double total, double current)
{char buff[NUM];memset(buff,0,sizeof(buff));const char* str = "|/-\\";int len = strlen(str);//当前进度int num = (int)(current*100)/total;int i=0;for(i=0;i<num;i++){buff[i]=CH;}static int cnt = 0;cnt%=len;printf("[%-100s][%d%%][%c]\r",buff,num,str[cnt]);cnt++;fflush(stdout);
}

*到这里本篇内容就结束了,希望对你有所帮助。

制作不易,感谢大佬的支持。

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2oul0hvapjsws

http://www.dtcms.com/a/420219.html

相关文章:

  • 莱芜住房和城乡建设厅网站专业网站建设哪家好
  • 时间轴网站模板仁怀哪儿做网站
  • 装修公司网站asp源码郴州做网站seo
  • 会网站开发想找兼职免费ppt模板下载简约
  • 网站运营与推广电子商务网站建设策略
  • 沈阳网站建设德泰诺谁有qq网站开发资源群
  • 北京公司网站建设定广州英铭网站建设
  • 网站建设详细步骤建建建设网站公司电话
  • 公司网站搭建费用wordpress积分 充值
  • 手机网站布局教程几分钟弄清楚php做网站
  • 网站建设与维护的试卷网站建设里面包含什么语言
  • 【实验报告】华东理工大学随机信号处理实验报告
  • 个人做网站 需要学什么只是陕西网站建设
  • 数据结构入门 (四):双向通行的“高速公路” —— 深入双向循环链表
  • 西安做网站公司玖佰网络如何在google上免费推广
  • 个人域名备案完成了 可以改网站内容吗wordpress个人展示网站6
  • MySQL中SELECT 语句如何 INTO OUTFILE 保存数据到文件
  • 防火墙技术、模型、发展趋势、局限性及安全体系相关分析
  • 上海网站建设公司推荐排名网站建设中英语
  • 电脑从做系统怎么找回以前登录的网站wordpress网站合并
  • 做网站排名多少钱有没有专门做儿童房的网站
  • 菁染料CY5-二硬脂酰基磷脂酰乙醇胺,CY5标记的二硬脂酰基磷脂酰乙醇胺三个核心组成部分
  • 酵母表面展示技术:真核蛋白工程的 “全能工具”,如何重塑生物医学研究?
  • 泸州市住房和城乡建设厅官方网站WordPress破解怎样主题修复
  • redis常见数据结构及其编码方式
  • 双八网站建设深圳定做网站
  • 来个网站奖励自己单页网站怎么制作教程
  • 网站建设费用做网站和app哪个简单
  • 什么网站可以做直播wordpress 多个域名
  • Windows版本PostgreSQL定时备份