文章目录
- 前言
- 一、回车与换行
- 二.行缓冲区
-
- 2.1倒计时程序
- 三、进度条程序
-
- 3.1main.c
- 3.2process.h
- 3.3process.c
- 总结

前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、回车与换行
我们常说的回车换行其实是两个概念
- 回车概念(\\r)
全称Carriage Return,计算机定义:光标/字符位置回到本行行首,不改变行数
printf("abc\\r123");
最终屏幕显示:
123
不是没输出abc,而是被123覆盖,因为中间有个回车符号
- 换行概念(\\n)
全称Line Feed,计算机定义垂直向下移动一行,不改变水平位置
printf("abc\\n123");
最终屏幕显示:
abc
123
- 老式打字机的例子
| 回车(Carriage Return) | \\r | 13 | 让 “字车”(装着纸的架子)回到当前行的最左侧,不移动纸张 |
| 换行(Line Feed) | \\n | 10 | 让纸张向下移动一行,不改变字车的水平位置 |
二.行缓冲区
要想理解行缓冲区,咱们先来看几段代码的现象,再来总结
- ①
#include<stdio.h>
#include<unistd.h>
int main()
{
printf("hello czh\\n");
sleep(3);
return 0;
}
现象
hello czh
czh@VM–0–3–ubuntu:~/vscode/code5–21$
hello czh碰到\\n换行,直接打印出内容,休眠三秒后,程序运行结束
- ②
#include<stdio.h>
#include<unistd.h>
int main()
{
printf("hello czh");
sleep(3);
return 0;
}
现象
hello czhczh@VM–0–3–ubuntu:~/vscode/code5–21$
自程序运行起,休眠三秒后,内容hello czh才被打印出来
- ③
#include<stdio.h>
#include<unistd.h>
int main()
{
printf("hello czh");
fflush(stdout);
sleep(3);
return 0;
}
现象
hello czhczh@VM–0–3–ubuntu:~/vscode/code5–21$
立马刷新hello czh,休眠三秒后程序运行,才打印出命令行
缓冲区 我们在使用函数对所有向外(显示器、文件、网络、管道)打印时,通常会将内容先存放在一个叫做缓冲区的东西。而我们的显示器刷新方式一般是行缓冲,也就是当缓冲区被写满时,数据就会被刷新出来。
那怎么样才能使得缓冲区中的东西刷新到显示器中呢?
2.1倒计时程序
懂得了回车换行,以及缓冲区的概念,我们来试着写一个倒计时 要求打印10-1,并且打印完才换行。
#include<stdio.h>
#include<unistd.h>
int main()
{
int count = 10;
while(count)
{
printf("%-2d",count);
fflush(stdout);
printf("\\r");
count—;
}
printf("\\n");
return 0;
}
这里的代码有几处需要跟大家强调一下
因为是打印倒计时,所以循环体中不能有换行符,所以只能是先往缓冲区输入数字,再立即刷新到显示器中 然后再回车,让光标移动到开头,再向缓冲区写数字,再刷新到显示器,等全部数字打印完毕,再换行打印出命令行
这里有一个细节,可以帮大家更好的理解回车概念
就是回车,它仅仅只是回车,也就移动光标,仅此而已,它并不会把先前的数据抹掉,什么意思呢? 也就是说,当你第一次打印完10之后,回车光标回到开头,你再去打印9的时候,它把原先10当中的1给覆盖了,所以第二次打印出来的结果是90
图片解析: 
怎么解决这个问题呢?
调整打印格式就好了 printf(“%-2d”,count);就能解决,-2标识向左对齐,不够两位数的空格来补,大于等于两位正常输出
printf("%-2d\\n", 5); // 输出:5_ (5后面跟1个空格,左对齐)
printf("%-2d\\n", 12); // 输出:12 (刚好2位,正常输出)
printf("%-2d\\n", 123); // 输出:123(超过2位,原样输出)
所以当打印数字9时,后面那个0就被空格替代了,就能看到9,而不是90了
三、进度条程序
3.1main.c
#include"process.h"
#include<stdio.h>
#include<unistd.h>
double total = 1024.0;//总共需要的下载量
double speed = 1.0;//速度是每次为1
void DownLoad()
{
double cur = 0;
while(cur <= total)
{
FlushProcess(total,cur);
usleep(3000);
cur += speed;
}
printf("\\ndownload %.2lfMB Done\\n",cur);
}
int main()
{
DownLoad();
return 0;
}
3.2process.h
#pragma once
#include<stdio.h>
void FlushProcess(double total,double cur);
3.3process.c
#include"process.h"
#include<string.h>
#include<unistd.h>
#define NUM 101
#define STYLE '='
void FlushProcess(double total,double cur)
{
char buffer[NUM];
memset(buffer,0,sizeof(buffer));//数组元素全设为字符0
const char* lable = "|/-\\\\";
int len = strlen(lable);
static int cnt = 0;
int num = (int)(cur*100/total);
int i = 0;
for(;i < num;i++)
{
buffer[i] = STYLE;
}
double rate = cur/total;
cnt %= len;
printf("[%-100s][%.1f%%][%c]\\r",buffer,rate*100,lable[cnt]);
cnt++;
fflush(stdout);
}
总结
提示:这里对文章进行总结: 例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。


