IccBuf 类

IccBuf 提供数据区的通用操作。 因为可以通过多种方式使用它,所以有几个 IccBuf 构造函数会影响对象的行为。 本节描述了 IccBuf 对象的两个重要属性。 它们是数据区所有权和数据区可扩展性。 本主题还提供了 IccBuf 构造函数的几个示例。

数据区所有权

IccBuf 具有一个属性,用于指示是在对象内部还是外部分配了数据区。 此属性的可能值为 internalexternal。 可通过 dataAreaOwner查询。

DataAreaOwner = external 时,应用程序开发人员有责任确保 IccBuf所基于的存储的有效性。 如果存储器对于应用于对象的特定方法无效或不合适,那么将发生不可预测的结果。

数据区可扩展性

此属性定义在创建 IccBuf 对象后是否可以增大数据区的长度。

此属性的可能值为 fixedextensible。 可通过 dataAreaType查询。

由于固定对象无法增加其数据区域的大小,因此分配给该 IccBuf 对象的数据(例如文件记录)的长度不得超过数据区域的长度;否则将抛出C++异常。

注: 根据定义,可扩展缓冲区 必须 也是内部缓冲区。

IccBuf 构造函数

IccBuf 构造函数有多种形式,在创建 IccBuf 对象时使用。 此处显示了一些示例。

示例 1
这将创建初始长度为零的 "内部" 和 "可扩展" 数据区。 将数据分配给对象时,将自动扩展数据区长度以容纳所分配的数据。
IccBuf buffer;
示例 2
这将创建初始长度为 50 字节的 "内部" 和 "可扩展" 数据区。 数据长度为零,直到将数据分配给对象为止。 如果将 50 字节的数据分配给对象,那么数据长度和数据区长度都将返回值 50。 将超过 50 个字节的数据分配到对象中时,将自动扩展数据区长度 (即,无需进一步干预) 以容纳数据。
IccBuf buffer(50);
示例 3
这将创建长度为 50 个字节的 "内部" 和 "固定" 数据区。 如果尝试将超过 50 个字节的数据分配给对象,那么将截断数据并抛出异常以通知应用程序错误情况。
IccBuf buffer(50, IccBuf::fixed);
示例 4
这将创建一个 IccBuf 对象,该对象使用名为 myRecord的 "外部" 数据区。 根据定义, "外部" 数据区也是 "固定" 的。 可以使用 IccBuf 对象上的方法或直接使用 myRecord 结构来分配数据。
struct MyRecordStruct
{
short id;
short code;
char data(30);
char rating;
};
MyRecordStruct myRecord;
IccBuf buffer(sizeof(MyRecordStruct), &myRecord);
示例 5
这将创建一个 "内部" 和 "可扩展" 数据区,其长度等于字符串 "Hello World" 的长度。 该字符串将复制到对象的数据区中。 然后,可以使用提供的其中一种操作方法 (例如 insertcutreplace) 来更改此初始数据分配。
IccBuf buffer("Hello World");
示例 6
此处,复制构造函数创建第二个缓冲区,其属性与第一个缓冲区几乎相同; 例外情况是数据区所有权属性-第二个对象始终包含 "内部" 数据区,该数据区是第一个数据区的副本。 在给定的示例中, buffer2 包含 "Hello World out in out" ,并且数据区长度和数据长度都为 21。
IccBuf buffer("Hello World");
buffer << " out there";
IccBuf buffer2(buffer);

IccBuf 方法

可以使用许多提供的方法来处理 IccBuf 对象; 例如,可以将数据附加到缓冲区,更改缓冲区中的数据,将数据从缓冲区中剪切出来,或者将数据插入到缓冲区的中间。

IccBuf中的运算符 const 字符 *=+===!=<< 已超负荷。 还有一些方法允许查询 IccBuf 属性。 有关更多详细信息,请参阅 基础类参考