赞
踩
1.空缓冲: 没有缓冲,也就是信息在输入输出的时候,立马输入或输出。(eg:标准错误流stderr)
2.行缓冲: 当输入输出的时候,遇到换行才执行I/O操作。(eg:键盘的操作)
3.全缓冲: 当输入输出写满缓冲区才执行I/O操作。(eg:磁盘的读写)
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("hehe ");
sleep(3);
return 0;
}
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("hehe \n");
sleep(3);
return 0;
}
(说明遇到了行缓冲,直接进行I/O)
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("hehe");
fprintf(stderr,"haha\n");
sleep(3);
return 0;
}
(原因:printf是全缓冲,等;接着第二行是空缓冲,直接输出haha,等3s之后,第一行的hehe再输出)
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("hehe\n");
fprintf(stderr,"haha\n");
sleep(3);
return 0;
}
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("hehe\n");
sleep(3);
fprintf(stderr,"haha\n");
return 0;
}
hehe
haha
实现进度条使用的是printf函数,printf输出函数是一个行缓冲函数,先写到缓冲区,满足条件就将缓冲区刷到对应文件中。满足下列条件之一,缓冲区都会刷新:
(1)缓冲区填满
(2)写入的字符中有’\n”\r’
(3)调用fflush刷新缓冲区
(4)调用scanf从缓冲区获取数据时,也会刷新新缓冲区。
因为实现进度条用的是行缓冲(printf),所以我们需要使用缓冲区刷新函数fflush来输出。否则我们看到的进度条将是一段一段输出的。
所以我们应该用的是’\r’.
#include "progressbar.h"
int main()
{
char buf[102] = "#";
char *r = "-/|-\\";
ProgressBar(buf,r);
}
#include "progressbar.h"
void ProgressBar(char buf[],char *r)
{
int i = 0;
while(i<=100)
{
printf("\033[33m[%-100s][%d%%][%c]\033[0m\r",buf,i,r[i%5]);
fflush(stdout);
buf[i++] = '#';
usleep(100000);
}
printf("\n");
}
#ifndef __PRB_H__
#define __PRB_H__
#include <stdio.h>
#include <unistd.h>
#include <string.h>
void ProgressBar(char buf[],char *r);
#endif //__PRB_H__
.PHONY:main clean
main: main.o progressbar.o
gcc $^ -o $@
%.o : %.c
gcc -c $^ -o $@
clean:
rm -rf *.o
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。