c++ 流的注意事项

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Buyi_Shizi/article/details/51861316

1,输入输出缓冲区

    每个输出流都有一个缓冲区,用来保护程序读写的数据,有了缓冲区,输出的数据可能不会立即写入到文件中,操作系统可以将程序的多个输出操作组合成单一的系统级写操作。由于设备的写操作可能很耗时,所以允许操作系统将多个输出操作组合为单一的设备写操作可以带来很大的性能提升。

    导致输出流(即,数据真正写到输出设备或者文件)的原因有很多:

    ---程序正常结束,作为main函数的return操作的一部分,缓冲刷新会被执行。

    ---缓冲区满时需要刷新,而后的戏数据才能写入缓冲区。

    ---我们可以使用操纵符endl来显式刷新缓冲区。

    ---在每个输出操作之前,我们可以用操纵符unitbuf设置流的内部状态,来清空缓冲区。默认情况下,对cerr是设置unitbuf的,因此写到cerr的内容都是立即刷新的。

    ---一个输出流可能被关联到另一个流,在这种情况下,但读写被关联的流时,关联到的流的缓冲区会被刷新。例如,默认情况下,cin和cerr都关联到cout。因此,都cin或写cout都会导致cout的缓冲区被刷新。

    刷新输出缓冲区:

    IO库中有除了endl还有一些操纵符是可以刷新缓冲区的,但是最终的效果和endl还是有细微差别:

    cout << "hi!" << endl; //输出hi!和一个换行,然后刷新缓冲区

    cout << "hi!" << flush; //输出hi!,然后刷新缓冲区,不附加任何额外字符

    cout << "hi!" << ends; //输出hi!和一个空字符,然后刷新缓冲区

    但是经过下面的程序调试发现,ends操纵符不会立即刷新缓冲区,而endl和flush都会立即刷新并输出:

    

#include "sales_data.hpp"
using namespace std;

int main()
{
	cout << "hi!";
	cout << "hi!" << ends;
	cout << "hi!" << ends << "I am niuyue";
	return 0;
}

    unitbuf操纵符:

    如果想在每次输出操作都刷新缓冲区,我们可以使用unitbuf操纵符。它告诉流在接下来的每次写操作之后都会进行一次flush操作。而nounitbuf操纵符则重置流,使其恢复使用正常的系统管理的缓冲区刷新机制。

    cout << unitbuf; 

    cout << nounitbuf;


猜你喜欢

转载自blog.csdn.net/Buyi_Shizi/article/details/51861316