设为首页 加入收藏

TOP

POCO C++库学习和分析 -- 流 (一) (一)
2014-11-24 02:39:42 】 浏览:3502
Tags:POCO 学习 分析

POCO C++库学习和分析 -- 流 (一)


流(Stream)是C++和C之间的一大区别。写C++的程序员都知道流的用法。在Poco库中,在标准流的基础上又扩充了一些流,分别是基于Base64和HexBinary的编解码流,使用zlib的数据压缩流,二进制的I/O流,文件流,以及一些其他的辅助流;另外Poco库还提供了一个扩展的结构,用于创建用户自定义流。

Poco库中所有的流类都与标准c++库中的流兼容。并且在Poco库中,大多数流都仅仅是个过滤器,这意味着它们不会直接从设备中读取或者写入数据,通常情况下它们会链接到另一个流上。下面我们分别对它们进行介绍。


1. 标准c++流介绍
在介绍Poco的流之前,我觉得有必要了解C++中的输入输出流,不然就会觉得Poco中的流很难理解。在看完C++的流结构后,自然会对Poco库中的流内容豁然开朗。我也一样。
为了保证语言和平台无关,C++和C一样,不具备内部输入输出能力。语言的输入输出能力是和操作系统相关的,在最底层都是通过调用操作系统的I/O库实现。

在C++的iostream流库中,存在着两个基本部分。分别是:
1. 流:C++把输入和输出看作字节流。输入时,程序从输出流中抽取字节;输出时,程序将字节插入到输出流中。流充当了程序和流源或者流目标之间的桥梁。
2. 缓冲区:缓冲区是用作中介的内存块,它是将信息从设备传输到程序或者从程序传输到设备的临时存储工具,用以匹配程序和设备之间速度的差距。从设计上说,增加了缓冲区,使的C++的iostream结构更具有扩展性。

C++的输入输出类图:

\

下面对C++中各个流类的介绍主要来自于wiki以及网站cplusplus。

1.1 ios_base
ios_base类封装了C++标准中的流,并定义了在输入输出中不依赖于读写的数据类型的基本信息和行为,如格式化信息、异常状态、事件回调等。

在类std::ios_base中,保存了下述关于流的信息:
格式控制信息的枚举类型fmtflags ,影响到如何解释输入串行的格式、如何生成输出串行的格式,例如整数是用16进制还是10进制表示,浮点数是科学计数法还是定点形式;
流的状态枚举类型iostate,如数据是否完整、是否到达流的末尾、是否读写失败等;
流的打开方式枚举类型openmode,如读取、写入、追加、创建时删除原内容、二进制打开、
流的定位位置枚举类型seekdir,如开始位置、当前位置、结尾位置等。
流的事件枚举类型event,如“擦除”事件erase_event,改变locale设置事件imbue_event,复制格式事件copyfmt_event。
流的私有的其它额外保存的数据,为一个long型数组与一个指针数组。
一个成员类failure,用于作为C++标准中,流输入输出类库抛出的各种异常的基类。
一个成员类Init,用于封装cout、cin、wcout等8个静态对象的初始化函数。

成员函数包括:

格式化:

1. 读取/设置流的格式


[cpp]

fmtflags flags() const;
fmtflags flags (fmtflags fmtfl);

fmtflags flags() const;
fmtflags flags (fmtflags fmtfl); 例子:
[cpp]
// modify flags
#include // std::cout, std::ios

int main () {
std::cout.flags ( std::ios::right | std::ios::hex | std::ios::showbase );
std::cout.width (10);
std::cout << 100 << '\n';
return 0;
}

// modify flags
#include // std::cout, std::ios

int main () {
std::cout.flags ( std::ios::right | std::ios::hex | std::ios::showbase );
std::cout.width (10);
std::cout << 100 << '\n';
return 0;
}

2. 设置流的格式,与原有格式合并
[cpp]
fmtflags setf (fmtflags fmtfl);
fmtflags setf (fmtflags fmtfl, fmtflags mask);

fmtflags setf (fmtflags fmtfl);
fmtflags setf (fmtflags fmtfl, fmtflags mask); 例子:
[cpp]
// modifying flags with setf/unsetf
#include // std::cout, std::ios

int main () {
std::cout.setf ( std::ios::hex, std::ios::basefield ); // set hex as the basefield
std::cout.setf ( std::ios::showbase ); // activate showbase
std::cout << 100 << '\n';
std::cout.unsetf ( std::ios::showbase ); // deactivate showbase
std::cout << 100 << '\n';
return 0;
}

// modifying flags with setf/unsetf
#include // std::cout, std::ios

int main () {
std::cout.setf ( std::ios::hex, std::ios::basefield ); // set hex as the basefield
std::cout.setf ( std::ios::showbase ); // activate showbase
std::cout << 100 << '\n';
std::cout.unsetf ( std::ios::showbase ); // deactivate showbase
std::cout << 100 << '\n';
return 0;
}输出:
Output:
0x64
64


3. 根据参数mask,清除流的格式的某些位(bit)
[cpp]
void unsetf (fmtflags mask);

void unsetf (fmtflags mask); 例子:
[cpp]
// modifying flags with setf/unsetf
#include // std::cout, std::ios

int main () {
std::cout.setf ( std::ios::hex, std::

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇蓝桥杯 2011年第二届C语言初赛试.. 下一篇设计模式应用与发展之工厂模式 c+..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目