当前位置: 首页 > 编程日记 > 正文

解决:VS 2005/2008 中 fstream 不能处理带有中文路径的问题

转自:http://blog.csdn.net/code_robot/archive/2010/06/23/5688867.aspx

有时候用ifstream或ofstream打开带有中文路径的文件会失败。

解决办法:
1、使用C语言的函数设置为中文运行环境
setlocale(LC_ALL,"Chinese-simplified");


2、使用STL函数设置为系统语言环境
std::locale::global(std::locale(""));

当然选2啦!

ofstream writefile;

string filename=("d:/我的文档/测试.txt");

locale loc = locale::global(locale("")); //要打开的文件路径含中文,设置全局locale为本地环境

writefile.open(filename.c_str(),ios::out); //打开文件

locale::global(loc);//恢复全局locale

用locale对象的name方法可以看到,通过locale("")构造出的locale对象的name为"Chinese_People's Republic of China.936",而原始的locale对象的name为"C",也就是缺省的ANSI_C公约。

注意:如果使用locale loc = locale::global(locale(""))设置全局locale后没有用 locale::global(loc)恢复的话,那么在程序后面的cout语句就不能输出中文了,虽然这时候操作中文文件没有问题,但是这也是很容易让人掉入陷阱的地方,应该值得注意。解决方法:

先将CString 转为char*

CString str=view->m_sFilePath;
   //CString str = "";
   //ofstream 中传的参数不能有汉字,必须转换,一下是其暂缓方法
   str.AppendFormat("cluster%d%d.txt",aMatrix->X_part,aMatrix->Y_part);
   char*   sz   =   str.GetBuffer(str.GetLength());
   locale loc = locale::global(locale(""));
   ofstream ofile(sz);

转自:http://anwj336.blog.163.com/blog/static/89415209200991931213190/

----------------------------------------------------------------------------------------------------------------------------------------------------


VC 2005中的locale
连续碰到两次和locale相关的问题,一次是ifstream, 一次是boost::format, 做了些实验记录下来:

1. ifstream 的文件名参数其实可以接受char *, 也可以接受wchar_t * 作为参数,如果接受char * 的话,实际上内部也是转换成为wchar_t *,但转换的时候问题就来了,如果此文件名里面有汉字,vc2005就转换不对,这样就打不开文件了。在vc2005中,一开始程序的缺省locale是”C”, 也就是std::locale::classic()返回的,但这个locale下,汉字转换是不正确的,所以,要先用 std::locale::global(std::locale(”"))这样的语句将locale设到系统缺省的。实际上std::locale::global(std::locale(”.936″)) 也是一样的。936就是简体中文的codepage(代码页)。 此时用 locale.name() 打印出来的locale名称为: “Chinese_People’s Republic of China.936″

2. 但是一旦locale变为936了,cout 输出中文就又会有问题,碰到中文就会断掉,而且后面的东西再也显示不出来。这可以通过在ifstream打开文件之后,用std::locale::global(std::locale(”C”))再设回缺省locale来解决。

3. locale设为936的另一个问题是,boost::format 中 如果输出数字的话,1234会变成1, 234. 这个问题也可以用上面的方法来解决。另外一个方法是可以用format的第二个参数来做,例如std::locale::classic() 或者std::locale(”C”);

4. 网上说流输出时候也会将1234变为 1,234,但我直接实验cout << 1234 好像没有问题。看到说碰到这种情况,需要用a.imbue(std::locale(”C”))。

5. 如果ifstream直接用wchar_t *的文件名参数,就很简单了,由于不更改locale就可以打开文件,后面的cout输出汉字也没有问题,boost::format也没有问题。所以竭力推荐这种方法

---------------------------------------------------------------------------------------------------------------------------------------------

一. locale
   一个流在初始化时将隐式地使用全局locale, 而初始时候的全局locale就是标准的"C"模式locale::classic()
在VC与中文版xp下, 也是这样。

二. 静态函数locale::global(newloc) 可设置newloc为全局locale,并且返回以前的全局locale,可将之保存起来
以后恢复, 随时要记得恢复这点很重要。
   locale newloc(""); //在简体中文xp系统上等价于".936"
   locale& oldloc = locale::global(newloc);
   ...
   locale::global(oldloc);
  
   纯API方式下用
   setlocale(LC_ALL,"C");   
   setlocale(LC_ALL,".936"); 也可以用 setlocale(LC_ALL,   "");

三. Bjarne Stroustrup提到用locale::global(x)的时候将同时设置全局locale,但我在VC中混用API
和stl的来设置locale时候有些微小的差别,所以今后要注意最好成对地设置,也就是用API去设置,以后恢复也用
API来做,相应地,用stl类locale去设置,也用同样的类去恢复回来。

转自:http://hi.baidu.com/eith/blog/item/4525a016635f9c5df3de3294.html

相关文章:

NLP文本标注工具与平台(数据标注公司)

最近在做NLP相关项目&#xff0c;包括句法分析、情感分析等&#xff0c;有大量数据需要标注。我评估了几个文本标注工具&#xff0c;也接触了几家数据标注公司和平台&#xff0c;总结如下&#xff0c;供各位参考。 文本标注平台&#xff08;标注外包公司&#xff09; 数据标注公…

一文读懂基于神经网络的图片风格转移

作者 | moliam转载自 CSDN 博客前言将A图片的风格转移到B图片上&#xff0c;指的是将A图片的抽象艺术风格&#xff08;如线条、色彩等等&#xff09;和B图片的内容框架合成为一幅图。自然地&#xff0c;A图片称为风格图&#xff0c;而B图片就称为内容图。就像这样&#xff1a;左…

【物联网中间件平台-01】真正面向物联网的组态软件 YFIOs和YFHMI的前生今世

1前言 从2001年进入工控领域以来&#xff0c;前后7年多的时间开发了诸如二型计量监控系统、焦炉四大机车自动化系统、烧结配水监控系统、隧道广告影像系统、通用组态软件、嵌入式系统组态软件&#xff08;基于WINCE系统&#xff09;、LED视频影像系统和ICU病室输液管理等系统。…

OpenCV常遇问题解决方法汇总

1、cvLoad的使用和释放&#xff1a; CvMat *mat (CvMat*)cvLoad("a.xml"); cvRelease((void**)&mat); 2、cvCreateMatHeader的使用和释放&#xff1a; CvMat *mat cvCreateMatHeader(4, 2, CV_64FC1); cvReleaseMatHeader(&mat); 在OpenCV2.1及OpenCV2.2中…

分享我如何在7年时间里成长为阿里Java架构师(附学习路线图)

2019独角兽企业重金招聘Python工程师标准>>> 如何更高效的学习&#xff1f; 1.架构师应不应该写代码 总的来说&#xff0c;架构师和程序员在某些方面上有点像产品经理和用户的关系&#xff0c;大部分程序员并不会主动告诉你他们想要什么、哪里需要优化&#xff0c;甚…

github 与git 使用 及配置

git 是网上很流行的版本控制工具 ,尝试 熟悉并使用 它&#xff08;也有windows版本&#xff0c;这里介绍mac的&#xff09; 额&#xff0c;再操作前 先看看这个 并跟着做做 http://www.uml.org.cn/pzgl/201204285.asp 1&#xff0c;到github官网 申请账号 2&#xff0c;…

如何发布ActiveX 控件

转自&#xff1a;http://blog.csdn.net/zougangx/archive/2008/07/30/2738147.aspx [背景] 做过ActiveX控件的朋友都知道&#xff0c;要想把自己做的ActiveX控件功能放在自己的网页上使用&#xff0c;那么用户在客户端就必须进行本地的注册&#xff0c;也就是说用户得首先要把该…

200行代码实现一个滑动验证码

作者 | 崔庆才 转载自进击的Coder&#xff08;ID: FightingCoder&#xff09;做网络爬虫的同学肯定见过各种各样的验证码&#xff0c;比较高级的有滑动、点选等样式&#xff0c;看起来好像挺复杂的&#xff0c;但实际上它们的核心原理还是还是很清晰的&#xff0c;本文章大致说…

Envoy源码分析之Dispatcher

2019独角兽企业重金招聘Python工程师标准>>> 摘要&#xff1a; Dispatcher 在Envoy的代码中Dispatcher是随处可见的&#xff0c;可以说在Envoy中有着举足轻重的地位&#xff0c;一个Dispatcher就是一个EventLoop&#xff0c;其承担了任务队列、网络事件处理、定时器…

Windows 8 快捷键大全

为什么80%的码农都做不了架构师&#xff1f;>>> win8快捷键大全&#xff1a; Windows 键 X &#xff1a;Windows快捷菜单 Windows 键 C &#xff1a;显示个性分类和时钟 Windows 键 I &#xff1a;打开“设置”个性分类 Windows 键 K &#xff1a;打开“设备”…

Activex、OLE、COM、OCX、DLL之间区别、联系

转自&#xff1a;http://baike.baidu.com/view/393671.htm 概述 .ocx是ocx控件的扩展名,与.exe .dll同属于PE文件。下面说说什么是ocx控件! OCX 是对象类别扩充组件。 如果你用过Visual Basic或者Delphi一类的可视化编程工具&#xff0c;那么对控件这个概念一定不会陌生&#…

不写一行代码,也能玩转Kaggle竞赛?

整理 | Jane 出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导读】AI科技大本营会给大家分享一些 Kaggle 上的资源&#xff0c;如 Kaggle 开放的数据集&#xff0c;也会分享一些好的竞赛方案或有意义的竞赛经验&#xff0c;帮助大家成长。今天&#xf…

认识flask框架-2

1.json:基于键值对的字符串&#xff0c;轻量级的数据交互格式&#xff0c;用来传输数据 2.json模块 dumps:把字典转化成json字符串。 loads&#xff1a;把json字符串转成字典。 dump、load操作的是文件对象。 jsonify可以返回json字符串&#xff0c;会修改响应的类型为applicat…

Sencha-概念-Layouts(布局)(官网文档翻译8)

Sencha-概念-Layouts(布局)&#xff08;官网文档翻译8&#xff09; 介绍和HBox 布局描述了在您的应用程序的组件的大小和位置。例如&#xff0c;一个电子邮件客户端可能具有固定到左边的消息的列表&#xff0c;以说&#xff0c;可用的宽度的三分之一&#xff0c;和一个消息观看…

Photoshop图像处理操作汇总

1、给图像添加外边框&#xff0c;保持图像原有大小&#xff1a; 点击图层-->新建-->图层&#xff0c;弹出新图层对话框&#xff0c;点击确定&#xff0c;点按"Ctrl A”键将图像全部选中&#xff0c;再点击编辑>描边&#xff0c;弹出描边对话框&#xff0c;在宽…

人工智能进军餐饮:AI调酒,越喝越有

作者 | 神经小姐姐来源 | 转载自HyperAI超神经&#xff08;ID:HyperAI&#xff09;导读&#xff1a;“吃”&#xff0c;现在已经成了一种文化&#xff0c;对食物的不懈追求&#xff0c;可以说是人类历史的一种推动力。从烹饪的进化&#xff0c;到现在花样百出的美食&#xff0c…

LaTeX - 带圈数字

2019独角兽企业重金招聘Python工程师标准>>> 法I. by zepinglee \documentclass[UTF8]{ctexart} \XeTeXcharclass①1 \XeTeXcharclass②1 \XeTeXcharclass③1 \XeTeXcharclass④1 \XeTeXcharclass⑤1 \XeTeXcharclass⑥1 \XeTeXcharclass⑦1 \XeTeXcharclass⑧1 \Xe…

akcms折腾记

这几天闲着无聊&#xff0c;找cms折腾一下&#xff0c;先是搞了大名鼎鼎的dedecms&#xff0c;不过那繁琐真不是盖的&#xff0c;想修改个模板不知从哪里动手。虽然现在工作的后台也是由dedecms改过来的&#xff0c;但平时也就发发文章而已。 然后就找到了这个神器&#xff1a;…

VC++ OCX 控件注册

转自&#xff1a;http://www.cctry.com/thread-5334-1-1.html 方法一&#xff1a;在dos或Windows命令行下运行&#xff1a;regsvr32 ocxname.ocx 注册 示例&#xff1a; regsvr32 netshare.ocx //注册netshare.ocx控件 regsvr32 /u netshare.ocx //解除netshare.ocx控件…

程序猿生存指南-4 借钱风波

借钱风波&#xff08;10&#xff09;临近春节&#xff0c;我的朋友圈被各个公司的年终奖刷屏。土豪互联网公司有送现金的&#xff0c;有送豪车的&#xff0c;还有送别墅的。它们享受着移动互联网的红利&#xff0c;赚得盆满钵满。不过翻看公司请媒体写的那些报道&#xff0c;就…

赛灵思:人工智能芯片发展方向与误区

演讲嘉宾 | 姚颂&#xff0c;赛灵思人工智能业务资深总监整理 | 夕颜人工智能发展过程中&#xff0c;算力是一个重要的因素&#xff0c;算力就像是 AI 的燃油&#xff0c;没有燃油&#xff0c;AI 哪也去不了。而为 AI 应用提供算力的&#xff0c;正是各种各样的芯片。而近几年&…

Python 多线程抓取网页 牛人 use raw socket implement http request great

Python 多线程抓取网页 - 糖拌咸鱼 - 博客园Python 多线程抓取网页最近&#xff0c;一直在做网络爬虫相关的东西。 看了一下开源C写的larbin爬虫&#xff0c;仔细阅读了里面的设计思想和一些关键技术的实现。1、larbin的URL去重用的很高效的bloom filter算法&#xff1b; 2、DN…

从特斯拉到英伟达,那些端到端自动驾驶研发系统有何不同?

作者 | 黄浴&#xff0c;奇点首席科学家兼总裁来源 | 转载自知乎专栏自动驾驶与视觉感知导读&#xff1a;近日&#xff0c;吴恩达的 Drive.ai 被苹果收购的消息给了自动驾驶领域一记警钟&#xff0c;但这个领域的进展和成果犹在。本文将介绍一些端到端的自动驾驶研发系统&#…

vc6中进行多行注释和反注释的方法

1、利用工具中自带的按钮实现&#xff1a; Tools-->Customize-->Add-ins and Macro Files-->将SAMPLE项选中-->Commands-->Category中选择Macros-->在Commands中将CommentOut拖到工具栏&#xff0c;再选中一个Images&#xff0c;点击OK即可。 这种方法是使…

一看就懂!【英雄联盟锐雯】与 Python 详解设计模式之门面模式

【网络配图】设计模式&#xff08;Design Pattern&#xff09;是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。使用设计模式的目的&#xff1a;为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。设计模式使代码编写真正工程化&#xff1b;设计模…

无法挂载 NTFS格式的分区:mount: unknown filesystem type ‘ntfs’

问题&#xff1a; # mount –t ntfs /dev/sdb1 /mnt/usb mount: unknown filesystem type ‘ntfs’ 这是由于CentOS release 5.3(Final)上无法识别NTFS格式的分区。解决办法&#xff1a; 通过使用 ntfs-3g 来解决。 打开ntfs-3g的下载点http://w…

vs2008 ActiveX控件测试容器的生成以及调试ActiveX控件

1、ActiveX控件测试容器的生成&#xff1a;用TSTCON生成测试容器 http://msdn.microsoft.com/zh-cn/library/f9adb5t5(vvs.90).aspx 在搜索里搜索tstcon,双击TstCon文件夹&#xff0c;将此文件夹里的东西全部复制到另外一个新的空文件里&#xff0c;然后打开解决方案 tstcon.…

百度自动驾驶新突破:获首批T4牌照,升级Apollo 5.0,将进行复杂城市场景路测...

作者 | KYLE WIGGERS等编译 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;最近&#xff0c;百度自动驾驶项目终于有了进展。先是上周悄然发布了 Apollo 的最新版本 Apollo 5.0&#xff0c;引入一些新功能&#xff1b;昨天下午&#xff0c;北京市自动驾驶测试…

折叠屏就要来了,适配逼死 Android 开发?

1. 异型屏还没适配好&#xff0c;折叠屏就要来了&#xff0c;Android 的碎片化&#xff0c;让开发者又多掉了不少头发。 北京时间 11 月 8 日&#xff0c;三星在旧金山向开发者发布了一款可折叠屏幕手机。并表示&#xff0c;新技术需要开发者调整其 App&#xff0c;以确保在手机…

nginx虚拟目录配置

2019独角兽企业重金招聘Python工程师标准>>> 今天搞了N久的虚拟目录配置&#xff0c;在几乎要放弃的时侯偶然看到一篇文章&#xff0c;将我的问题搞定 原贴地址&#xff1a;http://blog.sina.com.cn/s/blog_6c2e6f1f0100l92h.html 我的需求是这样的&#xff0c;系…