Linux小程序——进度条

目录

前言 

1.认识换行和回车

2. 认识缓冲区

概念

C语言刷新缓冲区

缓冲区现象

 倒数时程序

编写进度条小程序


前言 

1.认识换行和回车

换行 - 维基百科,自由的百科全书 (wikipedia.org)

回车符 - 维基百科,自由的百科全书 (wikipedia.org)

不同的系统处理文件的规则往往不同,主要体现在存储、文件末尾标记和衡量文件的大小三个方面。详情见 C Primer Plus p188。
由于这些差异,编程语言为了增强系统间的兼容性,不会直接处理文件,而是使用标准的I/O包处理流。流是一个实际输入或输出映射的理想化数据流。C语言将不同属性和不同种类的输入,用属性更统一的流来表示,文件的打开和关闭等过程就是把流与文件相关联,这涉及创建用于处理文件的标准模型和一套标准的I/O函数。举个例子,用if(ch\=='\\n')检查换行符,不同的系统会使用不同的方式标记文件末尾(回车符或者换行符),I/O函数会在这两种表示方法之间转换。

在Windows操作系统中,回车键通常被表示为回车(CR)和换行(LF)两个字符的组合(ASCII码值为13和10),而在Unix/Linux操作系统中,通常只使用换行符。

一般情况,换行是指从当前行到下一行,回车是指回到当前行首。 

2. 认识缓冲区

概念

缓冲器 - 维基百科,自由的百科全书 (wikipedia.org)

现阶段,我们可以理解为缓冲区为C语言维护的一段内存。

C语言刷新缓冲区

 int fflush(FILE* fp)函数
- 调用fflush()函数会将输出缓冲区中未输出的数据发送到fp指定的输出文件,这个过程称为刷新缓冲区。
- 如果fp是空指针,所有输出缓冲区都被刷新。
- 在输入流中使用fflush()函数的效果是未定义的。
- 只要最后一次操作不是输入操作,就可以用该函数更新流(任何读写模式)。

fflush - cppreference.com

缓冲区现象

我们创建一个目录processbar,在目录中创建以下四个文件。

我们make,执行生成的文件processbar, 程序会直接打印“hello world”,并延迟两秒,才显示下一行。我们修改main.c中的内容,去掉“\n”。

 清除旧的程序重新make,再执行新的processbar。

这里没有换行符,打印的“hello Linux”后直接连接“新的指令输入行”。

这里为什么是先延迟两秒再打印 “hello Linux”,而不是先打印后延迟?

难到是先调用main函数中的sleep,后调用printf????。

答案是不可能的,肯定先调用printf后调用sleep,不涉及函数跳转,main函数是按照栈中的顺序执行函数调用的,谁先进栈就先调用谁,printf先,sleep后。那么为什么会先延迟两秒再打印呢?

这是因为printf会先将要打印的内容输出到缓冲区,缓冲区通过换行符识别printf的输出结束,输出结束后,缓冲区会自动刷新并将内容打印到显示器。因为缓冲区没有识别到输出结束,等到main函数执行完后,操作系统会自动刷新缓冲区并关闭。

我们可以用fflush函数刷新缓冲区,这样就不会延迟打印了。

注意:C程序会自动打开三个文件,分别是标准输出(standard output)、标准输入(standard input)、标准错误输出(standard error output)。在默认情况下,标准输出和标准错误输出通常是系统的普通输出设备,通常为显示屏,标准输入通常为系统的普通输入设备,通常为键盘。
标准错误输出提供一个逻辑上不同的地方来发送错误消息。例如:如果使用重定向把数据发给文件而不是屏幕,那么发送值标准错误输出的内容仍然会被发送到屏幕上。

这里我们要刷新的是标准输出。

这样,就会先打印hello word,再延迟两秒,最后显示新的指令输入行。

 倒数时程序

 倒计时要在同一行的第一个字符依次打印。所以输入一个字符到缓冲区后,要输入回车键到缓冲区,刷新缓冲区(将之前输入的单个字符直接输出到显示屏)。回车键输入到屏幕会将屏幕的指针指向行首,下一次缓冲区输出到屏幕,会从屏幕当前行的行首打印。

但当我们把cnt改为10时,

 9、8、7、6后面会多个字符0。这是为什么呢?因为第一次刷新缓冲区,10输出到屏幕,回车键是屏幕的文件指针指向当前行行首,下一个循环,printf输出9\t到缓冲区,刷新缓冲区,“9\t”再输出到屏幕,9会覆盖1,然后屏幕的文件指针指向当前行行首,0没有被覆盖,所以一直会打印这个0。

如何解决这个问题呢?我们只要用printf输出两个字符宽度即可,如果不足两个字符,会用空白符补齐,这样就可以完全覆盖原先屏幕上的字符了。

都会依次打印10,9,8,,7,6,5,4,3,2,1,0。

编写进度条小程序

 版本1

版本2

但我们需要打印多行进度条时,

 这是为什么呢?

这是因为我们没有刷新字符串。我们只要增加一个字符串初始化函数,就没问题了。

同时,我们还可以改变进度条的颜色。

C语言输出有颜色的字体_c语言输出红色字体-CSDN博客 

这样进度条就变成绿色了。 

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值