Linux第一个小程序-进度条

news2024/11/20 7:15:30

目录

\r&&\n

行缓冲区概念

倒计时程序

进度条代码


\r&&\n

回车概念
换行概念
  • \n
[root@VM-12-17-centos lesson8]# touch test.c
[root@VM-12-17-centos lesson8]# touoch Makefile
bash: touoch: command not found
[root@VM-12-17-centos lesson8]# touch Makefile
[root@VM-12-17-centos lesson8]# vim Makefile
[root@VM-12-17-centos lesson8]# ll
total 4
-rw-r--r-- 1 root root 71 Jan 13 21:43 Makefile
-rw-r--r-- 1 root root  0 Jan 13 21:40 test.c
[root@VM-12-17-centos lesson8]# vim test.c
[root@VM-12-17-centos lesson8]# make
gcc -o mytest test.c
[root@VM-12-17-centos lesson8]# ls
Makefile  mytest  test.c
[root@VM-12-17-centos lesson8]# ./mytest
hello world
[root@VM-12-17-centos lesson8]# cat test.c
#include<stdio.h>
int main()
{
  printf("hello world\n");

  return 0;
}
  • \r
[root@VM-12-17-centos lesson8]# vim test.c
[root@VM-12-17-centos lesson8]# make
gcc -o mytest test.c
[root@VM-12-17-centos lesson8]# cat test.c
#include<stdio.h>
int main()
{
  printf("hello world\r");
 
  return 0;
}
[root@VM-12-17-centos lesson8]# ./mytest
[root@VM-12-17-centos lesson8]# make clean
rm -f mytest
  • \r\n
    [root@VM-12-17-centos lesson8]# vim test.c
    [root@VM-12-17-centos lesson8]# make clean
    rm -f mytest
    [root@VM-12-17-centos lesson8]# cat test.c
    #include<stdio.h>
    int main()
    {
      printf("hello world\r\n");
     
      return 0;
    }
    [root@VM-12-17-centos lesson8]# make 
    gcc -o mytest test.c
    [root@VM-12-17-centos lesson8]# ./mytest
    hello world
    

行缓冲区概念

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

什么现象?        直接打印hello world,好像没有执行sleep

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

什么现象??    先不显示,隔一段时间再打印,好像是先执行了sleep,再执行printf?

        并不是!!一定是先执行printf(从上到下),再执行sleep,sleep时,hello world字符串没有被刷新,数据在sleep期间被保存起来了。

        为什么\n,数据就显示出来了呢?缓冲区有自己的刷新策略,包括行缓冲

        我们也可以自主刷新,使用一定的函数帮助我们实现自主刷新

#include <stdio.h>
int main()
{
 printf("hello world");
 fflush(stdout);
 sleep(3);
 return 0;
}

        \r不显示的情况,其光标到达hello world的后一位,遇到\r回到此行最前面,Xshell接着打印[root@VM-12-17-centos lesson8]将hello world覆盖了,为了使其效果明显,我们改变自主刷新的位置

修改前

#include<stdio.h>
int main()
{
  printf("hello world\r");
  sleep(3);
  fflush(stdout);
  return 0;
}

修改后

#include <stdio.h>
int main()
{
 printf("hello world\r");
 fflush(stdout);
 sleep(3);
 return 0;
}

倒计时程序

        根据上述的\r\n的特性,我们编写一个倒计时程序
#include<stdio.h>
int main()
{
    int i=9;
    for(;i>=0;i--)
    {
         printf("%d\n",i);                                                                                             
         sleep(1);
    
    }
    
   return 0;
}
         我们尝试用\r,其字符在缓冲区存放,并未刷新,所以并不显示
#include<stdio.h>
int main()
{
    int i=9;
    for(;i>=0;i--)
    {
         printf("%d\r",i);                                                                                             
         sleep(1);
    
    }
    
   return 0;
}

         

        我们使用函数对其刷新,方便看倒计时

#include<stdio.h>
int main()
{
    int i=9;
    for(;i>=0;i--)
    {
         printf("%d\r",i);
         fflush(stdout);                                                                                             
         sleep(1);
    
    }
   printf("\n"); 
   return 0;
}

        我们尝试从10开始倒计时,键盘设备称为字符设备,是按字符打印、显示,所以从10开始倒计时,我们不能单纯地修改i的初始值为10,我们可以%2d去预留两个字符

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

进度条代码

样式

新建

[root@VM-12-17-centos lesson8]# mkdir proc
[root@VM-12-17-centos lesson8]# cd proc
[root@VM-12-17-centos proc]# touch proc.c
[root@VM-12-17-centos proc]# touch proc.h
[root@VM-12-17-centos proc]# touch main.c

main.c内

 #include "proc.h"
 
 int main()
 {
   process();
 
   return 0;
 }   

 proc.h内

[root@VM-12-17-centos proc]# vim proc.h
[root@VM-12-17-centos proc]# cat proc.h
#pragma once 

#include <stdio.h>

​extern void process();

proc.c内

#include "proc.h"
#include<string.h>
#include<unistd.h>

#define SIZE 102
#define STYLE '='
#define ARR '>'

// "|/-\\"
void process()
{
  const char *lable = "|/-\\";
  char bar[SIZE];
  memset(bar,'\0',sizeof(bar));
  int i=0;
  while(i<=100)
  {
    printf("[%-100s][%d%%][%c]\r",bar,i,lable[i%4]);
    fflush(stdout);
    bar[i++]=STYLE;
    if(i!=100)
    bar[i]=ARR;
    usleep(100000);
  }
  printf("\n");
}

Makefile

[root@VM-12-17-centos proc]# touch Makefile
[root@VM-12-17-centos proc]# vim Makefile
[root@VM-12-17-centos proc]# cat Makefile
myprocess:main.c proc.c
	gcc -o myprocess main.c proc.c

.PHONY:clean
clean:
	rm -f myprocess

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/163081.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python:每日一题之完全二叉树的权值

题目描述 给定一棵包含 N 个节点的完全二叉树&#xff0c;树上每个节点都有一个权值&#xff0c;按从 上到下、从左到右的顺序依次是 A1​,A2​,⋅⋅⋅AN​&#xff0c;如下图所示&#xff1a; 现在小张要把相同深度的节点的权值加在一起&#xff0c;他想知道哪个深度的节点 权…

【Linux操作系统】Linux进程状态和两个特殊进程

文章目录一.一套普适性的进程状态理论1.运行2.阻塞3.挂起二.一套具体的Linux进程状态1.R-运行2.S-睡眠3.T-暂停5.t-被追踪三.僵尸进程和孤儿进程1.僵尸进程2.孤儿进程一.一套普适性的进程状态理论 1.运行 由于CPU数量相对于进程数量来说少之又少,所以CPU维护了一个运行队列,方…

Synchronized底层原理系列之Synchronized的偏向锁实现原理

作者简介&#xff1a;专注于研究Linux内核、Hotspot虚拟机、汇编语言、JDK源码、各大中间件源码等等喜欢的话&#xff0c;可以三连关注~上篇文章已经对Synchronized关键字做了初步的介绍&#xff0c;从字节码层面介绍了Synchronized关键字&#xff0c;最终字节码层面就是monito…

【Linux】 iptables 入门简介

文章目录前言作用持久化和恢复执行的顺序前言 简单地说&#xff0c;iptables是Linux的防火墙程序。它将使用表监控进出服务器的流量。这些表包含称为链的规则集&#xff0c;这些规则将过滤传入和传出数据包。 作用 当数据包与规则匹配的时候&#xff0c;会为其指定一个目标&a…

基于幂等表思想的幂等实践

一、为什么需要幂等 分布式场景下&#xff0c;多个业务系统间实现强一致的协议是极其困难的。一个最简单和可实现的假设就是保证最终一致性&#xff0c;这要求服务端在处理一个重复的请求时需要给出相同的回应&#xff0c;同时不会对持久化数据产生副作用&#xff08;即多次操…

【Linux】Linux下调试器gdb的使用

&#x1f451;作者主页&#xff1a;安 度 因 &#x1f3e0;学习社区&#xff1a;StackFrame &#x1f4d6;专栏链接&#xff1a;Linux 文章目录一、前言二、铺垫三、指令集和使用1、指令集2、演示四、结语如果无聊的话&#xff0c;就来逛逛 我的博客栈 吧! &#x1f339; 一、前…

通信原理与MATLAB(十三):AMI的编解码

目录1.AMI的的编解码原理1.1 AMI编码原理1.2 AMI解码原理2.AMI编解码的代码3.AMI编解码结果图4.AMI的误码率曲线4.1 原理4.2 AMI的误码率曲线代码4.3 误码率曲线图1.AMI的的编解码原理 1.1 AMI编码原理 如下图所示&#xff0c;AMI的编码原理:将原始码元的1转换成1,0转换成-1。…

快过年了,用Python康康哪一家足浴店可以带朋友去玩.....

人生苦短&#xff0c;我用Python 首先肯定是去正经足浴店&#xff0c; 毕竟一年出差也不少&#xff0c; 大家都很辛苦&#xff0c; 好不容易放假了&#xff0c; 约上好兄弟一起去放松放松~ 所需环境 python 3.8 解释器pycharm 编辑器 所需模块 requests 数据来源分析 …

Silane-PEG-NH2 氨基聚乙二醇硅烷 NH2-PEG-Silane结构式

英文名称&#xff1a;Silane-PEG-NH2 Silane-PEG-Amine 中文名称&#xff1a;硅烷-聚乙二醇-氨基 分子量&#xff1a;1k&#xff0c;2k&#xff0c;3.4k&#xff0c;5k&#xff0c;10k&#xff0c;20k。。。 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 用 途…

2022年度总结,迎接2023

目录 我和CSDN的2022 初次见面&#xff1a; 你我的成长&#xff1a; 博客&#xff1a; 比赛&#xff1a; 我和CSDN的2023 我和CSDN的2022 初次见面&#xff1a; CSDN你好啊&#xff01;我跟你的初次见面在于2022年4月2日&#xff01;&#xff01;&#xff01; 这这半年内…

【算法5.1】背包问题 - 01背包 (至多最大价值、至少最小价值)

目录 至少模板和至多模板的两大区别 1、至多模板 2、至少模板 2. 01背包 - 至多模板 - 体积至多j&#xff0c;总价值最大 1、朴素做法 - 二维dp 2、优化 - 一维dp 4700. 何以包邮&#xff1f; - 至少模板 - 价值至少j&#xff0c;总价值最小 至少模板和至多模板的两大区…

list容器与vector容器的区别

vector与list都是STL中非常重要的序列式容器&#xff0c;它们都存放在namespace std命名空间中&#xff0c;由于俩个容器的底层结构不同&#xff0c;导致其特性不同 一、底层实现结构不同 vector本质是一段动态连续的顺序表&#xff0c;而list底层是一个双向循环链表 二、访…

Ubuntu多硬盘luks全盘加密自动解锁(硬件变更后失效)的方法

简介大家都知道&#xff0c;Linux现在用Luks全盘加密一直有一个痛点&#xff0c;就是每次开机都需要输入解密硬盘的密码&#xff0c;之后又要输入用户密码&#xff0c;非常的麻烦&#xff01;本文正是为了解决这个问题诞生的&#xff01;本文多硬盘加密带来的效果是&#xff0c…

Redis持久化——RDB机制详解

在运行情况下&#xff0c;Redis 以数据结构的形式将数据维持在内存中&#xff0c;为了让这些数据在 Redis 重启之后仍然可用&#xff0c;需要将数据写入持久存储 持久化是指将数据写入持久存储&#xff0c;例如固态磁盘(SSD) Redis 提供了一系列持久化选项。这些包括&#xff1…

Java-黑马Java学习作业-day07综合练习

学习视频链接&#xff1a;黑马Java学习视频 文章目录练习一&#xff1a;飞机票练习二&#xff1a;打印素数练习三&#xff1a;验证码练习四&#xff1a;复制数组练习五&#xff1a;评委打分练习六&#xff1a;数字加密练习七&#xff1a;数字解密练习八&#xff1a;抽奖解法一:…

【C++11】—— 可变参数模板

目录 一、可变参数模板概念以及定义方式 二、参数包的展开 1. 递归函数方式展开参数包 2. 逗号表达式展开参数包 三、STL容器中的empalce相关接口函数 一、可变参数模板概念以及定义方式 在c11之前&#xff0c;类模板和函数模板只能含有固定数量的模板参数&#xff0c;c11…

JavaScript高级 ES5 面向对象原型继承

原型以及ES5中实现继承1. 对象和函数的原型1. 普通对象的原型 [[prototype]]2. 函数的原型 prototype2. new、constructor1. new 操作符2. constructor属性3. 将方法放到原型上4. 创建对象的内存表现5. 重写原型对象3. 原型链的查找顺序4. 原型链实现的继承5. 借用构造函数继承…

深入URP之Shader篇10: 深度值专题(1)

之前研究Unlit shader的时候就遇到一些Z值相关的问题&#xff0c;一笔带过了&#xff0c;比如ComputeFogFactor中的UNITY_Z_0_FAR_FROM_CLIPSPACE。今天就把URP Shader中出现的Z相关的问题做一个专题一起研究下。 深度缓冲的方向和UNITY_REVERSED_Z 先说这个关于z的宏&#x…

nacos:服务注册与发现

导入SpringCloudAlibaba相关的依赖&#xff0c;并在父工程将依赖进行管理 <dependencyManagement> <dependencies> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-s…

Java EE|多线程代码实例之定时器与线程池

文章目录&#x1f534;定时器什么是定时器以及开发中的作用标准库中的定时器定时器的实现&#x1f534;线程池什么是线程池标准库中的线程池创建一个线程池ThreadPoolExecutor构造方法解析线程池的实现&#x1f534;定时器 什么是定时器以及开发中的作用 程序中的定时器功能与…