`
jgsj
  • 浏览: 960489 次
文章分类
社区版块
存档分类
最新评论

解决: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

分享到:
评论

相关推荐

    如何使用 <fstream> 类进行文件的 I/O 处理

    使用 &lt;fstream&gt; 类进行文件的 I/O 处理 摘要:传统的文件 I/O 库如 Unix 的 &lt;io.h&gt; 和 &lt;stdio.h&gt; ,由于其程序接口的原因,在很大程度上强制程序员进行某些处理,缺乏类型安全和国际化支持。C++ 的 &lt;fstream&gt; 库则在...

    c++头文件大全.txt

    C++ 标准库头文件大全 部分展示:合集可下载查看 通用实用程序 &lt;algorithm&gt;:算法 &lt;array&gt;:数组 &lt;bitset&gt;:位集 &lt;chrono&gt;:时间和日期 &lt;complex&gt;:复数 ...&lt;fstream&gt;:文件流 &lt;iomanip&gt;:输入/输出操作符格式化

    C语言头文件 FSTREAM.H

    C语言头文件 FSTREAM.HC语言头文件 FSTREAM.HC语言头文件 FSTREAM.HC语言头文件 FSTREAM.HC语言头文件 FSTREAM.HC语言头文件 FSTREAM.HC语言头文件 FSTREAM.HC语言头文件 FSTREAM.HC语言头文件 FSTREAM.HC语言头文件...

    Fstream: Managing Flash Sreams in the File System PPT

    Fstream: Managing Flash Sreams in the File System PPT

    C++stl标准库手册

    #include &lt;fstream&gt; using namespace std; int main () { int length; char * buffer; ifstream is; is.open ("test.txt", ios::binary ); // get length of file: is.seekg (0, ios::end); length = is....

    编程头文件:fstream.h

    如果你的fstream.h文件缺失,或者出了问题,可以直接下载这个文件,编程常用

    使用 <fstream> 类进行文件的 I/O 处理

    传统的文件 I/O 库如 Unix 的 &lt;io.h&gt; 和 &lt;stdio.h&gt; ,由于其程序接口的原因,在很大程度上强制程序员进行某些处理,缺乏类型安全和国际化支持。C++ 的 &lt;fstream&gt; 库则在文件的 I/O 方面提供了一个增强的、面向对象的...

    c++ fstream类详解

    fstream c++ fstream类详解

    c++ 文件操作(fstream)

    c++ 文件操作 fstream ifstream ofstream

    fstream 用法-有注解

    操作一个文件,文件流操作,是在控制台界面实现的

    fstream头文件

    fstream 继承 iostream; fstream 拥有iostream功能,但并不是包含关系 fstream 是对文件操作 而 iostream 是 对 标准输入输出文件的操作

    fstream的常用用法

    &lt;fstream&gt; 文件的I/O库提供了ANSI C的很多有用的优点,包括面向对象的界面,国际化和地方化的支持,安全性能,以及简单的调试

    fstream:将消息流写入文件

    fstream是用于在二进制文件队列中收集/读取输入消息的简单解决方案。 每个文件包含1分钟内收到的所有消息。 文件格式: &lt;uint16&gt; &lt;msg1&gt; &lt;uint16&gt; &lt;msg2&gt; ... 消息大小存储在uint16值中。 所有文件都保存在所选...

    头文件fstream.h

    头文件fstream.h

    考研复试机试C++中fstream用法

    考研复试机试C++中fstream用法,欢迎下载学习!!!

    C++_fstream的使用方法

    C++_fstream的使用方法,ifsream,ofstream

    Python库 | pyffstream-0.0.4a1.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:pyffstream-0.0.4a1.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    C++ fstream文件流读 中字符串string与b VB ListView控件各种

    C++ fstream文件流读 中字符串string与b VB ListView控件各种

    ofstream,ifstream,fstream读写文件

    在编程总经常会用到读写文件,基本都是使用ofstream,ifstream,fstream

    Python库 | pyffstream-0.0.20.dev9-py3-none-any.whl

    资源分类:Python库 所属语言:Python 资源全名:pyffstream-0.0.20.dev9-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

Global site tag (gtag.js) - Google Analytics