文章目录
- 1.文件缓冲区
- 1.1介绍
- 1.2缓冲文件系统
- 1.3冲刷函数fflush
- 1.4认识linux下的缓冲区
- 2.linux小程序的实现
- 2.1 回车\r和换行\n
- 2.2倒计时程序
- 2.3进度条小程序
- sleep/usleep
- 代码
- 运行结果
1.文件缓冲区
1.1介绍
为缓和 CPU 与 I/O 设备之间速度不匹配,文件缓冲区用以暂时存放读写期间的文件数据而在内存区预留的一定空间。使用文件缓冲区可减少读取硬盘的次数。
1.2缓冲文件系统
系统自动地在内存为程序中每一个正在使用的文件开辟一块文件缓冲区。
- 从内存向磁盘输出数据,先送到内存中的缓冲区,缓冲区装满后一起输送到磁盘上。
- 从磁盘向计算机读入数据,从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),从缓冲区逐个地将数据送到程序数据区(程序变量等)。
- 缓冲区的大小根据C编译系统决定。
1.3冲刷函数fflush
int fflush( FILE *stream );
将缓冲区内数据写到stream 指定文件。
成功返回 0
错误返回 EOF
高版本vs无法使用
fclose关闭文件时也会刷新缓冲区#include <stdio.h>
#include <windows.h>
int main()
{FILE* pf = fopen("test7.txt", "w");if (!pf){perror(fopen);return 1;}fputs("abcdef", pf); //数据输出到buffer//此时文件中无内容Sleep(10000); //睡眠10sfflush(pf); //刷新缓冲区Sleep(10000); //睡眠10s//此时数据到达文件fclose(pf);pf = NULL;return 0;
}
1.4认识linux下的缓冲区
在linux下gcc编译这两段代码时 结果是不同的 左边先输出后睡眠 右边先睡眠后输出
c语言不是从上到下一行一行执行的吗?
确实是的 实际上printf先于sleep执行但是sleep执行完后这个程序才结束 才会输出信息
为什么执行流到printf时 不直接显示以及为什么左边加了换行就能先显示?
c语言存在输出缓冲区(一段内存空间) 显示器设备一般的刷新策略是行刷新 即碰到\n就把\n之前的所有的字符显示出来 所以左边代码先显示 后边代码存入到缓冲区 直到程序结束才显示
当一个程序执行会自动打开stdin srdout stderr三个标准IO流
如何在没有换行符的情况下让他执行到printf时就显示?
#include <stdio.h>
#include<unistd.h>
int main()
{printf("hello linux!");fflush(stdout);sleep(3);return 0
}
2.linux小程序的实现
2.1 回车\r和换行\n
老式键盘的
Enter
: 实际上是 换行+回车[C语言中的\n也是]
#include <stdio.h>
#include<unistd.h>
int main()
{int count = 5;while(count){printf("count是: %d\n",count);count--;sleep(1);return 0;}
}
可以正常输出
#include <stdio.h>
#include<unistd.h>
int main()
{int count = 5;while(count){printf("count是: %d\r",count);count--;sleep(1);return 0;}
}
不输出任何内容
2.2倒计时程序
#include <stdio.h>
#include<unistd.h>
int main()
{int count = 5;while(count){printf("count是: %d\r",count);fflush(stdout);count--;sleep(1);return 0;}
}
每执行一次printf 将要输出的信息输出到缓冲区 当执行fflush函数时 将信息从缓冲区刷到显示器 之后\r回车 光标回到行首 count–
2.3进度条小程序
sleep/usleep
代码
运行结果
linu-vim-c-bar