C语言实现进度条

本文通过一个简单的C语言程序,深入探讨了printf中的 与fflush(stdout)的作用原理,揭示了这些基本元素如何影响程序的输出行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天整理文件发现一个隐藏在硬盘角落里的一段神秘代码,运行之后发现这是一断让我打开眼界的程序。

#include <stdio.h>
#include <unistd.h>
int main()
{
    int i;
    for(i=0;i<=100;i+=10)
    {
        printf("Percent completed:%3d%%\r",i);
        sleep(1);
       fflush(stdout);
    }
}

我们先在终端中运行该程序:
gcc -o func func.c
./func
程序会在同一行文件中打印 Percent completed:0% 10%……100%
对于这段神秘的代码,有两个需要注意的地方第一是printf中的\r,第二是fflush(stdout).

将\r换成\n

首先我们将\r换成\n,运行代码查看效果.
打印如下:
Percent completed:0%
Percent completed:10%
Percent completed:20%
Percent completed:30%
Percent completed:40%
Percent completed:50%
Percent completed:60%
Percent completed:70%
Percent completed:80%
Percent completed:90%
Percent completed:100%
这究竟是为什么呢?
经过查找C相关书籍终于在一本泛黄的书中某个角落里看到歪歪斜斜写着两行字:
\r 转义序列。表示carriage return(回车键)
\n是另起一行,\r的话回车回到本行的开头,如果继续输入的话会把先前的覆盖掉
原来竟是如此,\r自己很少使用.

注释掉fflush(stdout)

如果我们注释掉fflush(stdout)会有什么反应呢?
实践发现,注释掉fflush(stdout)之后程序运行一片空白.
在StackOverflow中看到如下解释:
You would use fflush(stdout) to ensure that whatever you just wrote in a file/the console is indeed written out on disk/the console.
The reason is that actually writing, whether to disk, to the terminal, or pretty much anywhere else, is pretty slow. Further, writing 1 byte takes roughly the same time as writing, say, a few hundred bytes[1]. Because of this, data you write to a stream is actually stored in a buffer which is flushed when it is full or when you call fflush. Calling fflush means you are accepting that your function call will take a bit of time but that you are 100% sure that you want this out right away.
至此我们可以看到在短短的几行代码中竟隐藏着这么多知识点.

<think>好的,我现在需要回答用户关于用C语言实现动态进度条的问题。首先,我得回忆一下之前提供的引用内容,看看有没有相关的代码示例。引用2和引用3都提到了C语言进度条实现,所以这些可能是关键。 用户想要动态的进度条,也就是在终端中实时更新的效果。通常,这需要控制输出,比如使用回车符`\r`来覆盖当前行,而不是换行。这样可以让进度条在同一行不断更新。 引用2中的代码是一个简单的15行示例,它使用`printf`和`\r`来实现动态效果,同时用`fflush(stdout)`确保输出立即显示。引用3的代码更复杂一些,包含进度条的填充字符和百分比显示。这两个例子都可以作为参考。 接下来,我需要把这些示例整理成一个清晰的步骤说明。首先,动态进度条的基本原理是:使用回车符、刷新输出缓冲区、控制输出格式。然后,分步骤解释如何实现,比如初始化进度条字符串,循环更新,处理显示效果等。 还需要考虑如何添加旋转符号或百分比,这样进度条看起来更生动。引用2中的`arr`数组用来显示旋转的符号,引用3则用了不同的填充字符。这些都可以作为示例代码的一部分。 另外,要注意不同平台的可能差异,比如`usleep`在Windows和Linux下的不同。可能需要提到这一点,或者建议使用可移植的函数。 最后,生成相关问题,帮助用户进一步学习,比如性能优化、原理深入或扩展功能。这些问题应该与进度条实现相关,但又不重复已有的内容。 总结一下,回答的结构应该是先介绍原理,再分步骤讲解,然后给出代码示例,最后附上相关问题。确保代码正确,符合C语言标准,并解释关键点,如`\r`和`fflush`的作用。</think>以下是用C语言实现动态进度条的详细方法和代码示例: ### 一、动态进度条实现原理 1. **行内刷新**:使用回车符$\\r$替代换行符$\\n$实现行内刷新[^2] 2. **缓冲刷新**:通过$fflush(stdout)$强制刷新输出缓冲区[^2] 3. **动态效果**:结合进度百分比+旋转符号+进度条图形化显示[^3] ### 二、分步骤实现代码 ```c #include <stdio.h> #include <unistd.h> // 包含usleep函数 int main() { const int TOTAL = 50; // 总进度单位数 char bar[TOTAL + 1] = {0}; // 进度条数组 const char* spin = "|/-\\"; // 旋转符号 for (int i = 0; i <= TOTAL; i++) { bar[i] = '#'; // 填充进度符号 // 输出格式:[进度条] 百分比 旋转符 printf("\r[%-50s] %3d%% %c", bar, i*2, spin[i % 4]); fflush(stdout); // 强制刷新输出缓冲区 usleep(100000); // 微秒级延时(0.1秒) } printf("\nDone!\n"); return 0; } ``` ### 三、关键代码解析 1. `\r`:将光标移动到行首实现覆盖效果[^2] 2. `%-50s`:左对齐50字符宽度保证进度条长度固定 3. `usleep`:控制刷新频率(100000微秒=0.1秒) 4. `spin[i % 4]`:循环显示4种旋转符号实现动画效果[^3] ### 四、增强特性建议 1. 添加颜色控制:使用ANSI转义序列 2. 支持进度回调:封装为函数供任务调用 3. 多线程处理:分离显示逻辑与任务逻辑
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值