c++ 流的注意事项
2016-07-08 15:46
232 查看
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;
每个输出流都有一个缓冲区,用来保护程序读写的数据,有了缓冲区,输出的数据可能不会立即写入到文件中,操作系统可以将程序的多个输出操作组合成单一的系统级写操作。由于设备的写操作可能很耗时,所以允许操作系统将多个输出操作组合为单一的设备写操作可以带来很大的性能提升。
导致输出流(即,数据真正写到输出设备或者文件)的原因有很多:
---程序正常结束,作为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;
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C++的template模板中class与typename关键字的区别分析
- C与C++之间相互调用实例方法讲解