进度条(小程序)

缓冲区的概念

缓冲区是内存中的一个临时存储区域,用来存放输入或输出数据。在标准 I/O 库中,缓冲区的使用可以提高数据处理的效率。例如,当向终端输出文本时,字符通常存储在缓冲区中,直到缓冲区满或者遇到特定条件时才实际向终端设备输出。

标准 I/O 的缓冲类型

标准 I/O 流(如 stdout,即标准输出)可以有以下几种缓冲模式:

  1. 全缓冲(Fully Buffered):数据会积存在缓冲区中,直到缓冲区满了才进行实际的 I/O 操作。这通常用在对文件的操作中。

  2. 行缓冲(Line Buffered):数据会积存在缓冲区中,直到遇到换行符或缓冲区满了才进行输出。标准输出通常是行缓冲的,当它连接到终端设备时。

  3. 无缓冲(Unbuffered):数据立即从程序传送到输出设备,stderr 通常是无缓冲的。

int main()
{
    printf("hellow world     ");
    sleep(3);
    return 0;
}

示例代码的缓冲行为

在您的示例代码中,printf("you can see me ") 输出一个字符串。由于这个字符串后面没有换行符(\n),并且程序随后执行了 sleep(3),所以这个字符串可能会停留在行缓冲中,直到程序结束或缓冲区满才会被实际输出。如果程序是在一个终端上运行,可能会有短暂的延迟,在 sleep 完成后,这条信息才显示在屏幕上。

强制刷新缓冲区

如果希望即使没有换行符也能立即看到输出,可以使用 fflush(stdout) 来强制刷新标准输出的缓冲区,使得所有缓冲的数据被立即写出: 

printf("you can see me ");
fflush(stdout);  // 强制刷新缓冲区,立即输出上面的文本
sleep(3);

回车+换行

回车(Carriage Return, CR)和换行(Line Feed, LF)是两个历史上用于表示文本行结束的控制字符,它们的使用和含义随操作系统的不同而有所变化。

回车 (CR)

  • 符号\r
  • ASCII 码:13
  • 用途:在打字机和早期的计算机打印设备中,回车指令使打印头回到行首的位置。

换行 (LF)

  • 符号\n
  • ASCII 码:10
  • 用途:在打字机和计算机打印设备中,换行指令使打印头下移一行。

不同操作系统中的使用

  1. Windows

    • 在 Windows 系统中,行结束符是回车加换行的组合(\r\n)。这种组合使得打印头首先回到行首(CR),然后向下移动到下一行(LF),这对应了早期打字机的操作。
  2. Unix/Linux

    • Unix 和 Linux 系统只使用换行(\n)作为行结束符。这简化了处理过程,因为大多数文本编辑和显示操作都默认新行开始于当前位置的下一行。
  3. Mac OS

    • 早期的 Mac 操作系统(如 Mac OS 9 及之前版本)使用单独的回车(\r)作为行结束符。但从 Mac OS X 开始,它转向了 Unix 风格,使用单独的换行(\n)。

编程和网络协议中的影响

在编程和数据交换中,不同的行结束符标准经常导致跨平台的文本处理问题。例如,一个在 Windows 上创建的文本文件可能会在 Unix/Linux 系统中显示为带有额外空白字符的长行,反之亦然。因此,许多现代文本编辑器和开发工具提供了自动检测或转换行结束符的功能。

在网络协议(如 HTTP)中,规定必须使用 \r\n 来结束一行,以确保协议的统一和兼容。

一个小的倒计时代码

int main()
{
    int cnt = 10;
    while(cnt)
    {
        printf("%-2d\r", cnt);
        fflush(stdout);
        cnt--;
        sleep(1);

    }
    printf("\n");
    return 0;
}

这段 C 程序是一个从 10 倒数到 1 的倒计时器。它使用 printf 函数和 \r(回车)来在同一行上更新数字,每次更新前都会将光标移回行首。fflush(stdout) 确保每次打印的数字都能立即显示出来,而 sleep(1) 让程序每打印一个数字后暂停一秒。最后,程序在倒计时结束后输出一个换行符,然后结束。

一个简易的进度条代码

#include <stdio.h>
#include <unistd.h>  
#include <string.h>

#define MAX 101
#define LABEL '='  

int main()
{
    char bar[MAX];
    memset(bar, '\0', sizeof(bar));  // 初始化数组,设置为全部是 null 字符
    
    int i = 0;
    while(i < 100)
    {
        printf("%s\r", bar);
        fflush(stdout);  // 刷新输出,确保每次循环的内容都能立即显示
        bar[i++] = LABEL;  // 将当前位置的字符设置为 LABEL
        usleep(100000);  // usleep 参数单位是微秒,100000 微秒等于 0.1 秒
    }
    printf("\n");  // 正确地输出一个换行符,原代码中写的是 %n
    return 0;
}

这段 C 程序创建了一个逐步填充的进度条。它初始化一个字符数组,然后在循环中逐个添加等号 ('=') 到数组中,并实时在终端显示更新的进度条,每次更新间隔0.1秒。循环完成后,程序输出一个换行符,以整洁地结束显示。

  • 20
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
小程序的audio组件可以让开发者方便地实现音频播放的功能。进度条是音频播放界面中经常用到的一种控件。在小程序中使用audio进度条可以让用户更加清晰地了解音频的播放进度,从而更好地掌握音频的播放状态。 实现audio进度条的方法比较简单。在audio组件中,可以使用onTimeUpdate事件来监听音频的播放进度。当音频播放时,该事件会不断触发,并携带当前的播放进度信息。开发者可以通过计算当前的播放进度与总时长的比值,得出当前进度条的位置,并动态更新进度条的UI。另外,如果需要实现进度条的拖动功能,也可以在进度条组件上设置bindchange事件,来监听用户对进度条的操作,并根据操作更新音频播放进度。 在实现audio进度条时,需要注意的一些点包括:首先,由于音频播放进度是不断变化的,因此需要在不断更新进度条UI的同时,尽量减少不必要的UI渲染操作,以提高程序的运行效率。其次,在用户暂停或拖动进度条时需要及时暂停或调整音频的播放进度,以保证播放的准确性。最后,在设计进度条的样式时需要注意与整个应用程序的UI风格保持一致,以提高用户的使用体验。 总之,通过使用小程序的audio组件,并结合进度条控件的应用,能够为用户提供一个清晰、直观的音频播放体验,同时也有助于开发者更好地掌握和管理音频的播放进度

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值