Linux第一个小程序-进度条(缓冲区概念)

1.\r和\n

C语言中有很多字符

a.可显字符

b.控制字符

对于回车其实有两个动作,首先换行,在将光标指向最左侧

\r :回车

\n:换行

下面举个例子:

Linux第一个小程序-进度条(缓冲区概念)_第1张图片
Linux第一个小程序-进度条(缓冲区概念)_第2张图片

把\n去掉会怎样

Linux第一个小程序-进度条(缓冲区概念)_第3张图片
Linux第一个小程序-进度条(缓冲区概念)_第4张图片

什么都没输出。为什么?

2.缓冲区概念

观察下两个代码的区别

Linux第一个小程序-进度条(缓冲区概念)_第5张图片
Linux第一个小程序-进度条(缓冲区概念)_第6张图片

上面的代码会等待3s后才输出,而下面的代码会直接输出。

不加\n好像是先执行了sleep,在执行printf?

并不是!!! 一定是先执行完printf,在执行sleep

Hello Linux没有被刷新,数据一定是在sleep期间被保存起来了,为什么\n,数据就显示出来了呢?

缓冲区有自己的刷新策略,只要看到\n,就会刷新

Linux第一个小程序-进度条(缓冲区概念)_第7张图片
Linux第一个小程序-进度条(缓冲区概念)_第8张图片

为什么没有显示Hello Linux 因为\r将光标移到了最左侧,然后显示的Hello Linux被root@ikun test覆盖。光标跟显示器匹配,光标在哪里,显示器就显示在哪里!

倒计时小程序

Linux第一个小程序-进度条(缓冲区概念)_第9张图片
d96507b78606ed1ae7618e3cb207f2f0.png

什么都没有显示

改写,刷新缓冲区

Linux第一个小程序-进度条(缓冲区概念)_第10张图片
Linux第一个小程序-进度条(缓冲区概念)_第11张图片

结果是从屏幕上倒计时从9到0

如果从10开始倒计时呢?

Linux第一个小程序-进度条(缓冲区概念)_第12张图片
8a794133c22ad67ad482999a5963623a.png

3.进度条程序

文件分离

Linux第一个小程序-进度条(缓冲区概念)_第13张图片

proc.h


#pragma once
#include   
#include"proc.h"
#include
#include  //该头文件是Linux下的,windows没有

#define SIZE 101
#define STYLE '='
#define ARR '>' 
extern void process();

proc.c


#include "proc.h"
void process()
{
    char bar[SIZE];
    memset(bar, '\0', sizeof(bar));  //初始化bar
    int i = 0;
    while (i <= 100)
    {
        printf("[%-100s][%d%%][%c]\r", bar, i);   //-100左对齐,
        fflush(stdout);  //刷新缓冲区
        bar[i++] = STYLE;
        if (i != 100)
            bar[i] = ARR;
        usleep(100000);
    }
    printf("\n");
}

main.c


#include "proc.h"

int main()
{
    process();

    return 0;
}
dd187fb983d057e10e0e129131d7d395.png

 

 

 

你可能感兴趣的:(linux)