0%

真正的I/O操作之应用:在程序中,内存中开辟的一片缓冲区域

2019年12月24日 下午10:51

c语言版本:

内存缓冲区解析 - lovejobs - 博客园
缓冲区顾名思义即为:内存中开辟的一片缓冲区域

  1. 按类型分为:全缓冲,行缓冲,不带缓冲
  2. 可以通过标准库函数setvbuf(_Inout_ FILE * _File, _Inout_updates_opt_z_(_Size) char * _Buf, _In_ int _Mode, _In_ size_t _Size);来设置缓冲区的类型

c++版本

C++ buffer缓冲区的秘密 - 学会走路 - 博客园

  1. 下列情况会引发缓冲区的刷新:

    • 缓冲区满时
    • 执行flush语句
      • cout<<flush; //将显存的内容立即输出到显示器上进行显示
    • 执行endl语句
      • endl控制符的作用是将光标移动到输出设备中下一行开头处,并且清空缓冲区。
    • 关闭文件
    • 注:可见,缓冲区满或关闭文件时都会刷新缓冲区,::进行真正的I/O操作::
  2. 文件操作演示全缓冲

    • 编写这段小代码的目的是验证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
      #include <fstream>  
      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;
      }
  3. 键盘操作演示行缓冲

    • 当程序调用getchar()函数时,程序就等着用户按键, 用户输入的字符被存放在键盘缓冲区中,直到用户按回车为止(回车字符也放在缓冲区中) 。当用户键入回车之后,getchar()函数才开始从键盘缓冲区中每次读入一个字符。也就是说,后续的getchar()函数调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完后,才重新等待用户按键。
    • 不知道您明白了没有,再通俗一点讲,当程序调用getchar()函数时,程序就等着用户按键,并等用户按下回车键返回。期间按下的字符存放在缓冲区,第一个字符作为函数返回值。继续调用getchar()函数,将不再等用户按键,而是返回您刚才输入的第2个字符;继续调用,返回第3个字符,直到缓冲区中的字符读完后,才等待用户按键。
    • ::核心:在执行真正的io操作以前,是有一个隐藏的缓冲区的::