第11章 流类库和输入输出.ppt

  1. 1、本文档共43页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* * * * * * * * * 宽字符、宽字符串与宽流 普通字符和字符串的缺陷 一个汉字被拆成两个字符 例:string s = “这是一个中文字符串”; s.size():返回18 s.substr(3,2):得到的结果是“且” s.find(“且”):返回3 * 深度探索 宽字符与宽字符串 宽字符:wchar_t类型 一般占2个字节,可以直接存下一个汉字 宽字符的文字以“L”开头,例: wchar_t c = L’人’; 宽字符串:wstring类型 与string同源 typedef basic_stringchar string; typedef basic_stringwchar_t wstring; 例 wstring s = L这是一个中文字符串; s.size():返回9 * 深度探索 宽流 宽流:以宽字符为基本单位的流 wistream、wifstream、wistringstream、wostream、wofstream、wostringstream、wios…… wcin、wcout、wcerr、wclog 宽字符和宽字符串需要通过宽流输入输出 宽流与普通流一一对应,彼此同源 typedef basic_ifstreamchar ifstream; typedef basic_ifstreamwchar_t wifstream; * 深度探索 为宽文件流配置编码方案 文件以字节为单位,编码方案决定了宽字符和字节的对应关系 例:L“ABCD”占4个字节,L“甲乙丙丁”占8个字节,这由编码方案体现 配置方法: 用“代码页”编号构造locale对象 执行流的imbue成员函数 示例 locale loc(.936); //创建本地化配置方案对象 wcout.imbue(loc); //设置wcout对象的编码方案 wcout L这是一个中文字符串 endl; //输出字符串 * 深度探索 例11-14宽流的应用 * #include iostream #include string #include fstream #include locale using namespace std; int main() { locale loc(.936); //创建本地化配置方案 wcout.imbue(loc); //为wcout设置编码方案 wifstream in(“article.txt”);//创建文件宽输入流,打开文件 in.imbue(loc); //为in设置编码方案 wstring line; //用来存储一行内容 unsigned number = 0; //记录行号 while (getline(in, line)) { number++; //行号加1 if (line.find_first_of(L人) != wstring::npos) wcout number L“: ” line endl; } return 0; } 深度探索 对象的串行化 串行化:将对象写入文件,使得在适当的时候对象能从文件中读出并恢复 直接用write将对象内容输出、用read将对象恢复的问题 对象中存在指针时,指针所指对象内容不会被保存; 对象的成员本身可能是存在指针的对象; 对象不仅是数据的集合,还包括一系列行为,用read只能恢复数据,不能触发相应行为 * 深度探索 串行化的基本方法 手工串行化的基本方法 手工编写save和load函数 按照相同的顺序保存/恢复数据成员 碰到指针时,首先保存指针是否为空的标志,如非空,将指针对象的内容保存,load做相反操作 完全手工编写串行化函数的困境 save和load对成员的操作顺序完全相同,存在逻辑上的重复 处理指针等操作过于繁琐 * 深度探索 boost::serialization 用Serialization库将下列结构体串行化: struct SalaryInfo { string name; double salary; TaxInfo *tax; }; 只需增加一个成员函数模板(需要TaxInfo也实现了同样的成员函数模板): template class Archive void SalaryInfo::serialize(Archive ar, unsigned int version) { ar name salary tax; } * 深度探索 理解Serialization serialize函数 serialize是模板,串行化和恢复都通过这一段源代码 “”被Serialization重载了,能够处理各种基本数据类型、标准库类型 “”碰到指针时,如果指针的目的类型也有se

文档评论(0)

xiaofei2001129 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档