输入输出缓冲区

C风格输入输出

又称为标准I/O ,实现了三种类型的缓冲:

  • 全缓冲:填满标准I/O缓冲区后才进行实际I/O操作

    • 对于磁盘上的文件通常是实施全缓冲的

    • 当缓冲区满时,标准I/O会自动flush缓冲区

    • 或者调用fflush()函数来flush一个流

    • 标准I/O方面,flush意味着将缓冲区内容写入磁盘,在终端驱动方面,flush表示丢弃存储在缓冲区中的数据

  • 行缓冲:在输入和输出是遇到换行符时,标准I/O执行I/O操作

    • 流涉及到一个终端时,实施行缓冲

    • 在输入输出遇到换行符时,执行I/O操作

    • 操作单个字符(fputs)时,也是在写了一行之后才进行实际的I/O操作

    • 行缓冲的长度是固定的,只要填满了缓冲区,无论有没有换行符都会进行I/O操作

    • 每次从一个不带缓冲的流或一个行缓冲的流得到输入数据,name就会flush所有行缓冲输出流,意思是前面有几个带缓冲的流,并且还没有到进行I/O操作的时候,接下来出现一个flush缓冲区的流,会将之前的数据也一起进行I/O操作。

  • 不带缓冲:不对字符进行缓冲存储

    • 如文件I/O输入输出read()write()

    • 通常stderr是不带缓冲的,使得错误信息能都很快显示出来

printf();   // 终端输出是行缓冲,文件输出是全缓冲,错误输出是不缓冲
putc();
fputs();
​
scanf();
getc();
fgets();
getline();

C++风格输入输出

C++风格的输入输出流和C风格的类似,因为其内部实现用的也是C风格输入输出

cin >>  ;
​
cout << ;
    
endl    // endl 表示 '\n' + flush

C++ 好的一点在于

  • 通过对<<运算符重载,可以实现连续的输出以及不带输出类型的输出

  • endl'\n'的区别:

    • endl不仅实现了换行操作,还对输出缓冲区进行flush

文件I/O输入输出

又被称为不带缓冲的I/O ,读或写完之后会直接输出,相当于每次执行完之后都会flush缓冲区。但在文件读写时会导致频繁的读写磁盘,会影响速度。

#include 
ssize_t read(inf fd, void* buf, size_t nbytes);
n = read(STDIN_FILENO, buf, BUFFSIZE);      // 从标准输入中读取数据
​
// STDIN_FINLNO与STDOUT_FILENO常量定义在#include中
​
ssize_t write(int fd, const void* buf, size_t nbytes);
n = write(STDOUT_FILENO, buf, n);       // 向标准输出中写入数据
​

默认情况

  • 当标准输入和标准输出不指向终端设备时,它才是全缓冲的,如文件操作

  • 标准错误一般是不带缓冲的

  • 若是指向终端设备的流,一般是行缓冲的

参考文献

《UNIX环境高级编程》

https://www.cnblogs.com/ncgds/p/5759551.html

 

你可能感兴趣的:(C++学习)