一蚊鸡保镖粤语下载:ofstream和wofstream与中文输出问题

来源:百度文库 编辑:中财网 时间:2024/05/03 09:15:06
使用C++标准库的iostream,可以方便地将控制台、文件、字符串以及其它可扩充的外部表示作为流来处理,但要处理中文,却会碰到很多问题。本人原来没怎么用过这个iostream,这几天尝试用这个写点东西,一会儿不能输出中文,一会儿不支持中文文件名的,搞得头大。网上搜了搜,没有发现适用于所有情况的解决方案。不过后来自己经过多次测试,基本解决了这些问题,现在写成文字作为一个总结,也供碰到同样问题的朋友参考。关于C语言中的printf和wprintf的中文输出,本文也进行了探讨。

  需要说明的是,我的开发环境是VS 2005(标准库当然也是微软实现的),不保证其它环境下是相同的效果。

1、cout和wcout

  在缺省的C locale下,cout可以直接输出中文,但对于wcout却不行(至少VS 2005下不行)。对于wcout,需要将其locale设为本地语言才能输出中文:

  wcout.imbue(locale(locale(),"",LC_CTYPE)); // ①

  也有人用如下语句的,但这会改变wcout的所有locale设置,比如数字“1234”会输出为“1,234”。

  wcout.imbue(locale(""));

2、ofstream和wofstream

  在缺省的Clocale下,ofstream能正确输出中文到文件中,但不支持中文文件名;wofstream支持中文文件名,但不能向文件中输出中文。要解决这个问题,需要在打开文件之前将全局locale设为本地语言。将全局locale设为本地语言后,ofstream和wofstream的问题都解决了,但cout和wcout却不能输出中文了。要让cout和wcout输出中文,需要将全局locale恢复原来的设置,如下所示:

  locale &loc=locale::global(locale(locale(),"",LC_CTYPE)); // ②
  ofstream ofs("ofs测试.txt");
  wofstream wofs(L"wofs测试.txt");
  locale::global(loc); // ③
  ofs<<"test测试"<<1234<  wofs<

3、printf和wprintf

  加上这两位C语言中的老兄,问题更加复杂。考虑如下语句(注意s的大小写):

   printf("%s", "multibyte中文\n"); // ④
   printf("%S", L"unicode中文\n"); // ⑤
   wprintf(L"%S", "multibyte中文\n"); // ⑥
   wprintf(L"%s", L"unicode中文\n"); // ⑦

  缺省情况下,⑤、⑦两条语句不能输出中文,这两条语句中字符串的形式是unicode形式的。如果在所有输出语句之前加上如下语句将C语言的全局locale设置为本地语言(C语言中只有全局locale)就可以正常输出了:

  setlocale(LC_CTYPE, ""); // ⑧

  但这会导致cout和wcout不能输出中文(汗,的确麻烦),将C语言的全局locale恢复后cout和wcout就正常了,如下所示:

  setlocale(LC_CTYPE, "C"); // ⑨

  但恢复后,printf和wprintf输出Unicode文本又不正常了(输出MultiByte文本总是正常的)。总不能每写一个printf/wprintf就设置一次然后再恢复一次吧?所以,建议不要混用iostream和printf/wprintf,实在要混用,那就让printf/wprintf只输出MultiByte字符串,这样不需要调用setlocale(),也就不会影响到cout和wcout。

总结

  总之,用iostream、printf/wprintf输出中文,有点麻烦。概括起来要点如下:

如果要用wcout,需要在使用之前按语句①将其locale设置为本地语言;
如果要用ofstream或wofstream,要在打开文件之前按语句②将全局locale设为本地语言并保存初始的全局locale。然后在打开文件之后,按语句③将全局locale恢复为初始值;
不要混用iostream和printf/wprintf。如果要混用,只用printf/wprintf输出MultiByte字符串;
单独使用printf/wprintf时,如果要输出Unicode字
g++编译器的ofstream对象 ofstream创建的对象指针怎么删除 为什么不能定义ofstream的全局变量? 如何在DreamWaver和FrontPage中创建与删除框架? 汉语语法中,与事和受事有区别吗 《浮士德》中从古希腊神话与传说和《圣经》 Platform SDK中与注册表相关的知识和函数 化学和物理学习中电池的联系与区别 社会调查中同质性和异质性的定义与区别 三国演义中望梅止渴和刮骨疗毒这两个情节与谁有关? 学计算机与科学技术与软件工程中国高校中除了清华和北大哪所高校比较好? 英语中gonna和wanna是什么意思,是等价与get to和want to吗 生活中如何和和别人相处?怎么样与人交流 “叙事”与“叙述”有何区别?故事中叙事和小说中叙事,故事中叙述与小说的叙述都有何区别?请举例说明。 填写亲戚与本人的关系中,伯父和舅舅分别与本人的关系该填什么 c/s和b/s在“网络流量采集与分析系统的设计与实现”中怎样应用 烦恼与不解中 儒家思想与中国法 国际经济与贸易这个专业中数学很重要吗?这个专业中什么学科和课程最重要啊? 着急:计算完税价格中,CIF与FOB的换算和国际贸易中所学的为什么不一样亚 迅雷和网际快车是否可以同时在与一个电脑中 在本科中,模具设计与制造和计算机信息管理哪个在就业方面前景不错 在生产与运作管理中,固定位置布置和功能布置有什么区别? 硫酸和磷酸的电位滴定中两个突跃点分别是什么与氢氧化钠反应?