本书是一本介绍C++标准IO流(Stream)和本地化的程序员手册,同时书后还附有完整的相关类、函数、模板和头文件等说明。\r\n\r\n 本书主要由三部分组成:第一部分为“输入与输出流”,包括第一章IO流基础;第二章IO流的结构,第三章输入/出流的高级用法。分别从最基本的什么是输入输出流,到流的格式、流的本地化等,一直介绍到流的各种高级用法。第二部分称为国际化,但主要介绍的是本地化,包括国际化与本地化的关系和重要性,为本地化而建立的Local和相关的类,以及如何正确合理地使用这些类。第三部分为参考指南,包括各个相关类、函数、模板和头文件的详细说明及用法。\r\n\r\n 本书特别适用于已经学过C++教程或有一定实际编程经验、并打算经常使用IO流和本地化的C++编程人员。对于那些经常使用C++作为编程工具的编程人员来说,本书是一本很有价值的常用参考书。\r\n
\r\n
第一部分 输人与输出流 \r\n\r\n 第一章 IO流基础 \r\n\r\n 1. 1 输入与输出 \r\n\r\n 1. 1. 1 什么是输入输出流 \r\n\r\n 1. 1. 2 用IO流进行文本流IO的步骤 \r\n\r\n 1. 1. 3 IO流的层次 \r\n\r\n 1. 1. 4 I0流类中流的概念 \r\n\r\n 1. 1. 5 IO流类中的类 \r\n\r\n 1. 1. 6 IO流作为框架 \r\n\r\n 1. 2 格式化输入/输出 \r\n\r\n 1. 2. 1 预定义的全局流 \r\n\r\n 1. 2. 2 输入输出运算符 \r\n\r\n 1. 2. 3 流的格式参数 \r\n\r\n 1. 2. 4 操纵符 \r\n\r\n 1. 2. 5 流的本地化 \r\n\r\n 1. 2. 6 有格式的输入与输出的比较 \r\n\r\n 1. 2. 7 格式输入的特性 \r\n\r\n 1. 3 流状态 \r\n\r\n 1. 3. 1 流状态标志 \r\n\r\n 1. 3. 2 测试流状态 \r\n\r\n 1. 3. 3 捕获流异常情况 \r\n\r\n 1. 3. 4 复位流状态 \r\n\r\n 1. 4 文件输入与输出 \r\n\r\n 1. 4. 1 创建. 打开. 关闭和析构文件流对象 \r\n\r\n 1. 4. 2 打开方式 \r\n\r\n 1. 4. 3 双向文件流 \r\n\r\n 1. 5 内存内部的输入/输出 \r\n\r\n 1. 5. 1 串流内容的获取和替换 \r\n\r\n 1. 5. 2 打开方式 \r\n\r\n 1. 6 非格式化的输入/输出 \r\n\r\n 1. 6. 1 非格式化输入 \r\n\r\n 1. 6. 2 非格式化输出 \r\n\r\n 1. 7 流的位置指针定位 \r\n\r\n 1. 7. 1 获取当前流位置指针 \r\n\r\n 1. 7. 2 改变流位置指针 \r\n\r\n 1. 8 流的同步 \r\n\r\n 1. 8. 1 同步的方法 \r\n\r\n 1. 8. 2 预定义标准流的同步 \r\n\r\n 第二章 IO流的结构 \r\n\r\n 2. 1 流 类 \r\n\r\n 2. 1. 1 类的继承关系 \r\n\r\n 2. 1. 2 流怎样管理流缓冲区 \r\n\r\n 2. 1. 3 流的拷贝和赋值 \r\n\r\n 2. 1. 4 流怎样管理locale \r\n\r\n 2. 1. 5 流. 流缓冲和locales间的合作 \r\n\r\n 2. 2 流缓冲类 \r\n\r\n 2. 2. 1 类继承关系 \r\n\r\n 2. 2. 2 流缓冲区的概念 \r\n\r\n 2. 2. 3 串流缓冲 \r\n\r\n 2. 2. 4 文件流缓冲 \r\n\r\n 2. 3 字符类型和字符特性 \r\n\r\n 2. 3. 1 字符表示 \r\n\r\n 2. 3. 2 字符特性 \r\n\r\n 2. 3. 3 字符类型 \r\n\r\n 2. 4 流的iterators和流缓冲的iterators \r\n\r\n 2. 4. 1 标准库中iterator的概念 \r\n\r\n 2. 4. 2 流iterator \r\n\r\n 2. 4. 3 流缓冲iterator \r\n\r\n 2. 5 增加的流存储空间和流回调函数 \r\n\r\n 2. 5. 1 增加的流存储空间 \r\n\r\n 2. 5. 2 流回调函数 \r\n\r\n 第三章 输入/输出流的高级用法 \r\n\r\n 3. 1 用户定义类型的输入输出 \r\n\r\n 3. 1. 1 插入函数和提取函数的定义 \r\n\r\n 3. 1. 2 第一种插入函数和提取函数 \r\n\r\n 3. 1. 3 改进 \r\n\r\n 3. 1. 4 改进后的插入画数和提取函数 \r\n\r\n 3. 1. 5 通用的插入画数和提取函数 \r\n\r\n 3. 1. 6 简单型设计与改进型设计的对比 \r\n\r\n 3. 2 用户定义的操纵符 \r\n\r\n 3. 2. 1 不带参数的操纵符 \r\n\r\n 3. 2. 2 带参数的操纵符 \r\n\r\n 3. 3 流的扩展功能 \r\n\r\n 3. 3. 1 流保存私有操作:iword. pword和xalloc的使用 \r\n\r\n 3. 3. 2 通过派生建立新的流类 \r\n\r\n 3. 3. 3 两种解决方案—iwor邮word与派生的比较 \r\n\r\n 3. 4 增加流缓冲功能 \r\n\r\n 3. 4. 1 从流缓冲基类派生 \r\n\r\n 3. 4. 2 从具体流缓冲类派生 \r\n\r\n 第二部分 国际化 \r\n\r\n 第四章 国际化和本地化 \r\n\r\n 4. 1 国际化和本地化 \r\n\r\n 4. 2 文化习俗 \r\n\r\n 4. 2. 1 语言 \r\n\r\n 4. 2. 2 数值 \r\n\r\n 4. 2. 3 货币 \r\n\r\n 4. 2. 4 时间和日期 \r\n\r\n 4. 2. 5 字. 词的排序 \r\n\r\n 4. 2. 6 消息 \r\n\r\n 4. 2. 7 字符编码 \r\n\r\n 第五章 locale \r\n\r\n 5. 1 locale对象的建立 \r\n\r\n 5. 1. 1 命名locale对象 \r\n\r\n 5. 1. 2 组合式locale \r\n\r\n 5. 1. 3 全局locale对象 \r\n\r\n 5. 2 从locale对象获得facet \r\n\r\n 5. 2. 1 has—facet()函数 \r\n\r\n 5. 2. 2 use—facet()函数 \r\n\r\n 第六章 标准facet \r\n\r\n 6. 1 与字母表和语言相关的facet \r\n\r\n 6. 1. 1 字符分类 \r\n\r\n 6. 1. 2 串整理 \r\n\r\n 6. 1. 3 代码转换 \r\n\r\n 6. 1. 4 消息目录 \r\n\r\n 6. 2 facet的格式化和解析 \r\n\r\n 6. 2. 1 数值和布尔值 \r\n\r\n 6. 2. 2 货币数值 \r\n\r\n 6. 2. 3 日期和时间值 \r\n\r\n 6. 3 locale中标准facet的分组 \r\n\r\n 6. 3. 1 标准facet族 \r\n\r\n 6. 3. 2 locale分类 \r\n\r\n 6. 3. 3 图示:facet和分类 \r\n\r\n 6. 4 标准facet的高级用法 \r\n\r\n 6. 4. 1 通过流间接使用facet \r\n\r\n 6. 4. 2 通过1ocale使用facet \r\n\r\n 6. 4. 3 独立于1ocale对象的facet的直接使用 \r\n\r\n 第七章 locale的框架体系结构 \r\n\r\n 7. 1 类的层次结构 \r\n\r\n 7. 2 在locale中识别与查找facet \r\n\r\n 7. 2. 1 facet的识别 \r\n\r\n 7. 2. 2 facet的查找 \r\n\r\n 7. 3 locale中facet的内存管理 \r\n\r\n 7. 3. 1 facet引用计数器 \r\n\r\n 7. 3. 2 locale中facet的不变性 \r\n\r\n 第八章 用户自定义facet \r\n\r\n 8. 1 将用户自定义的facet加入已有的facet族 \r\n\r\n 8. 2 定义新的facet族 \r\n\r\n 第三部分 参考指南 \r\n\r\n 1. LOCALE \r\n\r\n haader file<1ocale> \r\n\r\n global functions(全局函数) \r\n\r\n codecvt< internT, externT, stateT > \r\n\r\n codecvt base \r\n\r\n codecvt_byname \r\n\r\n collate \r\n\r\n collate_byname \r\n\r\n ctype \r\n\r\n cq(pe \r\n\r\n ctype_base \r\n\r\n ctype_byname \r\n\r\n locale \r\n\r\n messages \r\n\r\n messages_base \r\n\r\n messages_byname \r\n\r\n money_base \r\n\r\n money_get \r\n\r\n moneypunct \r\n\r\n moneypunct_byname \r\n\r\n money_put \r\n\r\n num_get \r\n\r\n numpunct \r\n\r\n numpunct_bynanle \r\n\r\n num_put \r\n\r\n time base \r\n\r\n time_get \r\n\r\n time_get_byname \r\n\r\n time_put \r\n\r\n time_put_byname \r\n\r\n time base \r\n\r\n tm \r\n\r\n 2 . CHARACTER TRAITS \r\n\r\n header file \r\n\r\n char traits \r\n\r\n char traits \r\n\r\n char Raits \r\n\r\n 3. IOSIREAMS \r\n\r\n header file \r\n\r\n header file \r\n\r\n header file \r\n\r\n header file \r\n\r\n header file \r\n\r\n header file \r\n\r\n header file \r\n\r\n header file \r\n\r\n header 81e \r\n\r\n global type definitions \r\n\r\n global objects \r\n\r\n basic_filebuf \r\n\r\n basic_fstream \r\n\r\n basic_ifstream \r\n\r\n basic_ios \r\n\r\n basic_iosffeam \r\n\r\n basic_istream \r\n\r\n basic_istringsUeam \r\n\r\n basic_ofstream \r\n\r\n basic_ostream \r\n\r\n basic_ostringstream \r\n\r\n basic_streambuf \r\n\r\n basic_stringbuf \r\n\r\n basic_string sReam \r\n\r\n fqos \r\n\r\n ios base \r\n\r\n manipulators \r\n\r\n 4. STREAM ITERATORS \r\n\r\n headerfile \r\n\r\n istreambuf_iterator \r\n\r\n istream_iterator \r\n\r\n iterator \r\n\r\n iterator category tags \r\n\r\n ostreanlbuf_iterator. \r\n\r\n ostream_iterator. \r\n\r\n 5. OTHER I/O OPERATIONS \r\n\r\n bitset \r\n\r\n complex<T> \r\n\r\n basic_String<charT, traits, Allocator> \r\n\r\n 附录A 数字量与060I值的解析与抽取 \r\n\r\n A. 1 解析数字量 \r\n\r\n A. 2 解析boo1值 \r\n\r\n A. 3 转换说明符与长度变量修饰符 \r\n\r\n 附录B 数字量与BOOL值的格式化 \r\n\r\n B. 1 数字量的格式化 \r\n\r\n B. 2 bool值的格式化 \r\n\r\n B. 3 转换说明符. 限制符与长度变量修饰符 \r\n\r\n 附录C Strftime()转换说明符 \r\n\r\n 附录D C stdio与C++输入输出流的对应关系 \r\n\r\n D. 1 文件打开模式 \r\n\r\n D. 2 流状态 \r\n\r\n 附录E 经典IO流和标准IO流之间的差异 \r\n\r\n E. 1 IO流类的模板化 \r\n\r\n E. 2 分区基本类ios \r\n\r\n E. 3 指示错误 \r\n\r\n E. 4 国际化IO流 \r\n\r\n E. 5 消除_withassign类 \r\n\r\n E. 6 消除文件描述符 \r\n\r\n E. 7 串流:用stringstream替换strstream \r\n\r\n E. 8 对流缓冲器类的改变 \r\n\r\n E. 9 次要的变换 \r\n\r\n 附录F C与C++Locales的关系 \r\n\r\n E1 C与C++Locales的类型 \r\n\r\n E2 C和C++的全球Locales \r\n\r\n 附录G 新C++的特性与习惯用语 \r\n\r\n G. 1 位掩码类型 \r\n\r\n G. 2 POD—简单的旧数据 \r\n\r\n G. 3 显式构造 \r\n\r\n 0. 4 模板说明 \r\n\r\n G. 5 默认的模板自变量 \r\n\r\n G. 6 显式模板自变量说明 \r\n\r\n G. 7 typename关键词 \r\n\r\n G. 8 动态的引用 \r\n\r\n G. 9 函数try块 \r\n\r\n G. 10 标准的异常情况 \r\n\r\n G. 11 数的限制 \r\n\r\n G. 12 C++串 \r\n
\r\n
由于C++编程语言自身的特点, 加上企业界的大量采用, 近年来, 学习. 使用C++编程语言日益流行. 当使用C++编程语言来编写程序时, 很大的一部分工作是在与它的各种库, 或者各种类打交道, 在这当中又常常涉及到其中的两个重要领域——IOStream(IO流, 输入输出流)和本地化.
随着计算机在世界范围的日益流行, 计算机软件需要解决的一个问题是对其国际化和本地化的处理. 其实, 当人们在使用或开发一个计算机软件产品时, 一定会自觉或不自觉地有这样的感受:一个计算机软件产品不仅仅是一个单纯的技术产品, 它本身常常带有非常浓厚的地理区域和文化习俗色彩. 一般说来, 软件都离不开输入输出, 而这些输入输出避不开各种地理区域和文化色彩的影响. 一个很简单的例子就是, 全世界有成千上万种语言文字, 最常用的就有几十种, 计算机软件的使用者当然最喜欢使用自己的母语. 很容易理解, 使用中文的用户, 一般都希望软件也是中文的. 因此, 要开发满足这种要求的软件就一定会融入中国的文化习俗. 比如:软件中要使用中国语言的文字字符, 要使用到相应的语言文字字符的标准编码, 软件中要用中国表示日期和时间的方法, 要用表示中国货币的表示方式……, 等等.
不难理解, 当软件开发人员要开发一个软件产品时, 该软件就可能要涉及到需要处理多种特定的语言语文字. 特定的文化习俗信息. 如何在技术上实现?如何在满足其通用性的同时又满足其本地性的要求?这些问题都是软件开发人员需要仔细考虑周到, 并且给予适当解决.
当我们使用C++编程语言作为开发软件的工具时, 同样会碰到上面提到的类似问题. 为了更方便用户了解它. 使用它, 人民邮电出版社组织引进翻译了《Standard C++ IOStreams and Locales》一书, 希望对有关人员有所帮助.
需要说明一点的是, 此书是一本介绍标准IO流和本地化的程序员手册, 附有完整的相关类. 函数. 模板和头文件等的说明, 它的目的并不是教给读者有关C++或IO流的基本知识. 因此, 这本书并不适合初学者, 而适用于那些已经学过C++教程, 或者有—定实际编程经验. 并打算经常使用IO流和本地化的C++编程人员.
参加本书翻译工作的还有许永凯. 末兆松. 朱小艳等, 杨放鸣参加了部分文字录入和校阅的工作.
由于时间仓促, 加之译者水平有限, 本书难免有不妥之处, 敬请读者批评指正.
译者
2000年7月
我在C++的输入/输出库上的工作开始于1986年左右, 那时我开始修改贝尔实验室C++内部发行版中的stream库部分程序上的一个漏洞. 同时, 我还决定将C的stdio库所具有. 而这个stream库所缺乏的一些功能添加进去. 当我进一步审视这个stream库时, 我突然意识到C++中输入输出库的体系结构引发了有关C++设计的一些有趣问题, 而且明白了是什么构成了现在的这个IOStream库. 起初, 我认为这只是一个内部用于试验而使用的库, 没打算用它来替换stream库. 但后来, Bjame Stroustrup鼓励C++开发产品部门将stream库换成IOStream(IO流)库, 而他们确实也这么做了. 这使得我起初以为只需花费几个月的一件小事变成了后来持续了10多年的一项艰苦工作, 其中包括ANSI/ISO标准化的工作.
我最初设计的一个主要目标是使IO流库可以以多种有趣的方式扩展. 具体来说, 在stream库中, streambuf类只是一个实现上的细节, 但是在IO流库中, 我打算让它本身成为一个有用的类. 我希望编写出多个功能不同的streambuf类, 但除了我自己写了几个之外, 几乎没有人这么做. 我回答的问题多半是诸如“我怎样使我的数字看起来像这样”, 而不是“我怎样写一个streambuf类”. 就连教科书的作者也将streambuf忽略不谈. 很显然, 没有人同意我的观点, 即输入/输出库的体系结构是一个值得研究的有趣问题.
我常常被问及的另一个问题是“为什么这些stream类的成员不是虚函数”, 进一步讨论的结果往往是, 提问者需要编写一个具有某种独特功能的streambuf类, 或者有时候他要做的是另写一个用streambuf类进行传送的顶层类. 而当我愿意就此进行详细解释时, 他们又往往失去了兴趣.
所有这些都让我产生了一种对这个库没有物尽其用的沮丧和失望. 好几个朋友都劝我通过写书来消除这种沮丧情绪. 他们的理由是, 可扩展性的特点很难理解, 但是一本讲解清晰的书可以鼓励人们去使用它. 随着C++标准化工作的深入和这个库复杂程度的增加, 写这样一本书的必要性与日俱增. 我好几次都打算开始这项写作工作, 但由于时间和精力的关系, 始终未能如愿.
在此期间, 每当我听说有关于IO流库的书时, 我的心情都十分复杂. 一方面, 我非常高兴看到IO流库得到越来越多的关注, 但另一方面, 我又担心这些书会比我捷足先登.
但我的担心完全是多余的, 这些书都没有涉及到我所关心的主要问题, 即库体系结构和C++设计.
也就是说, 本书是第一本涉及到上面两个问题的书. 它不仅回答了我所关心的问题, 而且还提供了具体的例子, 以使读者能快速地将这些思想应用到自己的需求中去. 由于我现在已经不用再考虑写书的问题, 所以我对这本书的感觉就都是正面的了.
Jerrv Schwarz
1999年11月