C++流操作与本地化处理详解
立即解锁
发布时间: 2025-08-22 00:46:22 阅读量: 2 订阅数: 12 


C++编程语言第三版:全面解析与实践
### C++ 流操作与本地化处理详解
#### 1. 流缓冲区
流缓冲区的操作函数有以下几个虚函数:
```cpp
virtual int_type pbackfail(int_type c = Tr::eof());
virtual int_type overflow(int_type c = Tr::eof());
virtual basic_streambuf<Ch,Tr>* setbuf(Ch* p, streamsize n);
virtual pos_type seekoff(off_type off, ios_base::seekdir way,
ios_base::openmode m = ios_base::in|ios_base::out);
virtual pos_type seekpos(pos_type p,
ios_base::openmode m = ios_base::in|ios_base::out);
virtual int sync();
virtual void imbue(const locale& loc);
```
这些用于操作缓冲区的函数是从 `basic_streambuf` 继承而来,保持不变。只有影响初始化和缓冲策略的函数需要单独提供。
同时,还提供了常见的类型定义及其宽流对应版本:
```cpp
typedef basic_streambuf<char> streambuf;
typedef basic_stringbuf<char> stringbuf;
typedef basic_filebuf<char> filebuf;
typedef basic_streambuf<wchar_t> wstreambuf;
typedef basic_stringbuf<wchar_t> wstringbuf;
typedef basic_filebuf<wchar_t> wfilebuf;
```
#### 2. 本地化处理
本地化对象(`locale`)用于控制字符分类(如字母、数字等)、字符串排序顺序以及输入输出时数值的显示方式。通常,`iostream` 库会隐式使用 `locale` 对象,以确保遵循某种自然语言或文化的常规约定。程序员可以通过更改流的 `locale` 来改变流的行为,以适应不同的约定。
`locale` 类定义在命名空间 `std` 中,其定义如下:
```cpp
class locale {
public:
// ...
locale() throw(); // 复制当前全局本地化对象
explicit locale(const char* name); // 使用 C 本地化名称构造本地化对象
basic_string<char> name() const; // 返回此本地化对象的名称
locale(const locale&) throw(); // 复制本地化对象
const locale& operator=(const locale& ) throw(); // 复制本地化对象
static locale global(const locale&); // 设置全局本地化对象(返回之前的全局本地化对象)
static const locale& classic(); // 获取 C 定义的本地化对象
};
```
以下是一个示例,展示如何切换流的 `locale`:
```cpp
void f()
{
std::locale loc("POSIX"); // POSIX 标准本地化对象
cin.imbue(loc); // 让 cin 使用该本地化对象
// ...
cin.imbue(std::locale::global()); // 将 cin 重置为使用默认本地化对象
}
```
可以设置所有新构造流使用的 `locale`:
```cpp
void g(const locale& loc = locale()) // 默认使用当前全局本地化对象
{
locale old_global = locale::global(loc); // 使 loc 成为默认本地化对象
// ...
}
```
设置全局 `locale` 不会改变正在使用之前全局 `locale` 值的现有流的行为。特别是 `cin`、`cout` 等不受影响。如果需要改变它们的行为,必须显式调用 `imbue()` 函数。
#### 3. 流回调
有时候,人们希望向流的状态中添加一些信息。例如,希望流“知道”是否应以极坐标或笛卡尔坐标输出复数。`ios_base` 类提供了 `xalloc()` 函数,用于为这种简单的状态信息分配空间。`xalloc()` 返回的值标识了一对位置,可以通过 `iword()` 和 `pword()` 访问:
```cpp
class ios_base {
public:
// ...
~ios_base();
locale imbue(const locale& loc); // 获取和设置本地化对象
locale getloc() const; // 获取本地化对象
static int xalloc(); // 获取一个整数和一个指针(都初始化为 0)
long& iword(int i); // 访问整数 iword(i)
void*& pword(int i); // 访问指针 pword(i)
// 回调:
enum event { erase_event, imbue_event, copyfmt_event }; // 事件类型
typedef void (*event_callback)(event, ios_base&, int i);
void register_callback(event_callback f, int i); // 将 f 附加到 word(i)
};
```
`register_callback()` 函数用于“注册”一个函数,当指定的“事件”发生时调用该函数。例如,调用 `imbue()`、`copyfmt()` 或 `~ios_base()` 时,分别会调用为 `imbue_event`、`copyfmt_event` 或 `erase_event` 注册的函数。当流的状态改变时,注册的函数会使用 `re
0
0
复制全文
相关推荐










