赞
踩
目录
学习c语言时,我们可以粗略把字符分为可显字符和控制字符.
在按回车换到下一行开始的操作时,实际上是进行了两个操作:1.让光标跳到下一行(只是垂直向下,这一步的操作称为换行).2.让光标跳到最开始的位置(此操作称为回车).
即\r
:回车 \n
换行。
而在c语言环境下把\n简化 其代表回车加换行。
\n,\r都存在,既有回车又有换行,所以其linux
的命令行在我们执行程序下面。
们在上面说了,这是我们在这个语言环境下我们将其简化,此时的\n
就表示回车加换行。
\r \n都没有
linux命令就直接跟在文本行后面。
只有回车的效果,光标本来在文本行最后一个字符旁,回车后光标来到了文本行开始,最终导致文本被覆盖。
- #include<stdio.h>
- #include<unistd.h>
-
- int main()
- {
- printf("hello world");
- sleep(3);
- }
运行上面代码会发现结果没有立马打印出来,这是因为数据在sleep期间被暂时保存起来。
但是如果加上\n,数据就会显示出来。————缓冲区有自己的行缓冲刷新策略。
- 1 #include<stdio.h>
- 2 #include<unistd.h>
- 3
- 4 int main()
- 5 {
- 6 int i=0;
- 7 for(i=9;i>=0;i--)
- 8 {
- 9 printf("%d\r",i);
- 10
- 11 sleep(1);
- 12 }
- 13 return 0;
- 14 }
我们利用\r覆盖的特性实现如上代码,但是结果倒计时却不显示,原因是数据存放在缓冲区里,缓冲区没有被刷新。我们将代码修改如下:
- 1 #include<stdio.h>
- 2 #include<unistd.h>
- 3
- 4 int main()
- 5 {
- 6 int i=0;
- 7 for(i=9;i>=0;i--)
- 8 {
- 9 printf("%d\r",i);
- 10 fflush(stdout);
- 11 sleep(1);
- 12 }
- 13 return 0;
- 15 }
以上代码我们会发现如果时间变成两位数,将只能覆盖一位数,因此修改为:
- 1 #include<stdio.h>
- 2 #include<unistd.h>
- 3
- 4 int main()
- 5 {
- 6 int i=0;
- 7 for(i=9;i>=0;i--)
- 8 {
- 9 printf("%-2d\r",i);
- 10 fflush(stdout);
- 11 sleep(1);
- 12 }
- 13 return 0;
- 15 }
- ~
-
第一个括号是进度条 第二个括号是进度百分比 第三个是旋转图标 用于判断是否卡住。
proc.h
,编写进度条的头文件proc.c
,编写进度条的函数main.c
,测试进度条
proc.h
- 1 #pragma once
- 2
- 3 #include <stdio.h>
- 4
- 5 void process(); ~
main.c
- 1 #include "proc.h"
- 2
- 3 int main()
- 4 {
- 5 process();
- 6 return 0;
- 7 }
proc.c
- 1 #include"proc.h"
- 2 #include<unistd.h>
- 3 #include<string.h>
- 4
- 5 // "|/-\"旋转标志
- 6 void process()
- 7 {
- 8 const char* lable ="|/-\\"; //特殊字符\需要用\\
- 9
- 10 //为什们要定义101个字符?
- 11 //就是因为我们的进度条有100个
- 12 //但是字符的结尾要用\0表示所以我们要有101个字符
- 13 char bar[101];
- 14 //先将进度条设置为\0,然后在依次增加#。
- 15 memset(bar,'\0',sizeof(bar));
- 16 int i=0;
- 17 while(i<=100)
- 18 {
- 19 printf("[%-100s] [%d%%] [%c]\r",bar,i,lable[i%4]);
- 20 fflush(stdout);
- 21 bar[i++]='#';
- 22 usleep(100000);
- 23 }
- 24 printf("\n");
- 25
- 26 }
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。