2019年12月24日 下午10:51
c语言版本:
内存缓冲区解析 - lovejobs - 博客园
缓冲区顾名思义即为:内存中开辟的一片缓冲区域
- 按类型分为:全缓冲,行缓冲,不带缓冲
- 可以通过标准库函数
setvbuf(_Inout_ FILE * _File, _Inout_updates_opt_z_(_Size) char * _Buf, _In_ int _Mode, _In_ size_t _Size);来设置缓冲区的类型
c++版本
下列情况会引发缓冲区的刷新:
- 缓冲区满时
- 执行flush语句
cout<<flush; //将显存的内容立即输出到显示器上进行显示
- 执行endl语句
endl控制符的作用是将光标移动到输出设备中下一行开头处,并且清空缓冲区。
- 关闭文件
- 注:可见,缓冲区满或关闭文件时都会刷新缓冲区,::进行真正的I/O操作::
文件操作演示全缓冲
- 编写这段小代码的目的是验证Windows7下全缓冲的大小是4096个字节,并验证::缓冲区满后会刷新缓冲区,执行真正的I/O操作::。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using namespace std;
int main()
{
//创建文件test.txt并打开
ofstream outfile("test.txt");
//向test.txt文件中写入4096个字符’a’
for(int n=0;n<4096;n++)
{
outfile<<'a';
}
outfile<<'b';
//暂停,按任意键继续
system("PAUSE");
//继续向test.txt文件中写入字符’b’,也就是说,第4097个字符是’b’
outfile<<'c';
//暂停,按任意键继续
system("PAUSE");
outfile('d');
return 0;
}
- 编写这段小代码的目的是验证Windows7下全缓冲的大小是4096个字节,并验证::缓冲区满后会刷新缓冲区,执行真正的I/O操作::。
键盘操作演示行缓冲
- 当程序调用getchar()函数时,程序就等着用户按键, 用户输入的字符被存放在键盘缓冲区中,直到用户按回车为止(回车字符也放在缓冲区中) 。当用户键入回车之后,getchar()函数才开始从键盘缓冲区中每次读入一个字符。也就是说,后续的getchar()函数调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完后,才重新等待用户按键。
- 不知道您明白了没有,再通俗一点讲,当程序调用getchar()函数时,程序就等着用户按键,并等用户按下回车键返回。期间按下的字符存放在缓冲区,第一个字符作为函数返回值。继续调用getchar()函数,将不再等用户按键,而是返回您刚才输入的第2个字符;继续调用,返回第3个字符,直到缓冲区中的字符读完后,才等待用户按键。
- ::核心:在执行真正的io操作以前,是有一个隐藏的缓冲区的::