在windows平台上,使用STLport,如何通过wchar_t*类型的路径构造ifstream和ofstream?

weaver2007 2014-03-24 07:37:21
目的:
实现二进制文件的读写。
1)要使用宽字符形式的文件名,只有这样才能保证所有语言的windows系统上都能支持任何字符构建的文件路径。
2)要使用ifstream和ofstream,因为wifstream和wofstream的操作单元是wchar_t不是char,无法做到逐字节操作。

综上,1)和2)产生了冲突。
如果采用wifstream,wofstream就可以使用宽字符的路径,但不能逐字节操作文件内容;
如果采用ifstream,ofstream可以逐字节操作文件内容,但是不能使用宽字符的文件路径。

MSVC2005以后,VC自带的STL库中的ifstream和ofstream支持使用宽字符的文件路径。
但STLport中的ifstream和ofstream好像没有这种支持。

有没有遇到类似问题的高人。求指点。
...全文
245 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
weaver2007 2014-03-25
  • 打赏
  • 举报
回复
引用 10 楼 weaver2007 的回复:
[quote=引用 9 楼 hiroyukki 的回复:] 这和 STLport 无关,我之所以用FILE是因为以前某次使用VC自带的STL也出现了 ifstream 不能支持中文的问题。貌似STL标准是支持UTF8,你也可以在WINDOWS平台上将 ucs2 转成 utf-8 字串尝试,这样就不需要用 FILE 了。 不过话说回来,stl 都用了,使用 FILE* 并没什么问题,C只能比CPP移植性更好。
呵呵,用FILE的话,得多管理一个变量嘛。 只要能让ifstream认识Unicode编码(ucs2或utf8)的路径就能解决问题了。 您前面给的方案,是让ifstream认识ucs2编码的路径,试试了一下是OK的。 但是,windows上直接把ucs2的路径转换为utf-8传递给fstream不行,试了一下打开失败。 [/quote] 另外,_wfopen应该是windows平台特有的函数,其它平台应该是不支持的。
weaver2007 2014-03-25
  • 打赏
  • 举报
回复
引用 9 楼 hiroyukki 的回复:
这和 STLport 无关,我之所以用FILE是因为以前某次使用VC自带的STL也出现了 ifstream 不能支持中文的问题。貌似STL标准是支持UTF8,你也可以在WINDOWS平台上将 ucs2 转成 utf-8 字串尝试,这样就不需要用 FILE 了。 不过话说回来,stl 都用了,使用 FILE* 并没什么问题,C只能比CPP移植性更好。
呵呵,用FILE的话,得多管理一个变量嘛。 只要能让ifstream认识Unicode编码(ucs2或utf8)的路径就能解决问题了。 您前面给的方案,是让ifstream认识ucs2编码的路径,试试了一下是OK的。 但是,windows上直接把ucs2的路径转换为utf-8传递给fstream不行,试了一下打开失败。
贪食蛇男 2014-03-25
  • 打赏
  • 举报
回复
这和 STLport 无关,我之所以用FILE是因为以前某次使用VC自带的STL也出现了 ifstream 不能支持中文的问题。貌似STL标准是支持UTF8,你也可以在WINDOWS平台上将 ucs2 转成 utf-8 字串尝试,这样就不需要用 FILE 了。 不过话说回来,stl 都用了,使用 FILE* 并没什么问题,C只能比CPP移植性更好。
weaver2007 2014-03-25
  • 打赏
  • 举报
回复
引用 7 楼 hiroyukki 的回复:
有办法,ifstream有构造是用 FILE* 所以: FILE* f = _wfopen(L"宽字符文件名", L"rb"); if (!f) { return false; } ifstream input(f); xxxxxx fclose(f);
多谢!多谢! 这个完全能实现我的要求,但这个使用了C的FILE,不用FILE这个可以吗?。 不知道STLport里有没有其它方案。 如果没有的话,可能要自己封装一个了,呵呵。
贪食蛇男 2014-03-25
  • 打赏
  • 举报
回复
有办法,ifstream有构造是用 FILE* 所以: FILE* f = _wfopen(L"宽字符文件名", L"rb"); if (!f) { return false; } ifstream input(f); xxxxxx fclose(f);
weaver2007 2014-03-24
  • 打赏
  • 举报
回复
引用 3 楼 taodm 的回复:
就别用stlport了。
能给个原因吗? 看了许多对STLport 和 MSVC 自带的STL库的比较,几乎一边倒地支持STLport呀。
weaver2007 2014-03-24
  • 打赏
  • 举报
回复
引用 2 楼 tujiaw 的回复:

std::wstring ansi2unicode(const std::string& ansi)
{
    if (ansi.empty()) {
        return std::wstring(L"");
    }
    int len = MultiByteToWideChar(CP_ACP, 0, ansi.c_str(), -1, NULL, 0);
	std::wstring unicode(len + 2, L'\0');
    len = MultiByteToWideChar(CP_ACP, 0, ansi.c_str(), ansi.size(), &unicode[0], len);
    return unicode;
}

std::string unicode2ansi(const std::wstring& unicode)
{
    if (unicode.empty()) {
        return std::string("");
    }
    int len = WideCharToMultiByte(CP_ACP, 0, unicode.c_str(), -1, NULL, 0, NULL, NULL);
	std::string ansi(len + 1, '\0');
    WideCharToMultiByte(CP_ACP, 0, unicode.c_str(), unicode.size(), &ansi[0], len, NULL, NULL);
    return ansi;
}
谢谢! 但是和 1楼 同样的问题,这种转换不是在所有语言的系统上都能正常工作。
weaver2007 2014-03-24
  • 打赏
  • 举报
回复
引用 1 楼 oYinGui1 的回复:
WideCharToMultiByte 函数功能:该函数映射一个unicode字符串到一个多字节字符串。
是的。 但是,如果我理解的正确的话,这个函数有一定的局限性。 因为他一定要把宽字符字串转换为ANSI字符串,如果当前的ANSI编码不支持宽字符串中的某些字符,路径转换为会失败,文件就无法正常访问。比如我在英文系统上,如果宽字符串路径中有中文,转换后应该会出现“?”。导致访问异常 这也是我要采用wifstream和wofstream的原因。
taodm 2014-03-24
  • 打赏
  • 举报
回复
就别用stlport了。
ningto.com 2014-03-24
  • 打赏
  • 举报
回复

std::wstring ansi2unicode(const std::string& ansi)
{
    if (ansi.empty()) {
        return std::wstring(L"");
    }
    int len = MultiByteToWideChar(CP_ACP, 0, ansi.c_str(), -1, NULL, 0);
	std::wstring unicode(len + 2, L'\0');
    len = MultiByteToWideChar(CP_ACP, 0, ansi.c_str(), ansi.size(), &unicode[0], len);
    return unicode;
}

std::string unicode2ansi(const std::wstring& unicode)
{
    if (unicode.empty()) {
        return std::string("");
    }
    int len = WideCharToMultiByte(CP_ACP, 0, unicode.c_str(), -1, NULL, 0, NULL, NULL);
	std::string ansi(len + 1, '\0');
    WideCharToMultiByte(CP_ACP, 0, unicode.c_str(), unicode.size(), &ansi[0], len, NULL, NULL);
    return ansi;
}
Morrisss_ 2014-03-24
  • 打赏
  • 举报
回复
WideCharToMultiByte 函数功能:该函数映射一个unicode字符串到一个多字节字符串。
内容简介回到顶部↑这本书不适合C++ 初学者,不适合 Genericity(泛型技术)初学者,或 STL 初学者。这本书也不适合带领你学习面向对象(Object Oriented)技术 — 是的,STL 与面向对象没有太多关连。本书前言清楚说明了书籍的定位和合适的读者,以及各类基础读物。如果你的Generic Programming/STL实力足以阅读本书所呈现的源码,那么,恭喜,你踏上了基度山岛,这儿有一座大宝库等着你。源码之前了无秘密,你将看到vector的实现、list的实现、heap的实现、deque的实现、RB-tree的实现、hash-table的实现、set/map 的实现;你将看到各种算法(排序、搜寻、排列组合、数据移动与复制…)的实现;你甚至将看到底层的memory pool 和高阶抽象的traits 机制的实现。那些数据结构、那些算法、那些重要观念、那些编程实务中最重要最根本的珍宝,那些蜇伏已久彷佛已经还给老师的记忆,将重新在你的脑中闪闪发光。 目录回到顶部↑庖丁解牛(侯捷自序) i 目录 v 前言 xvii 本书定位 xvii 合适的读者 xviii 最佳阅读方式 xviii 我所选择的剖析对象 xix 各章主题 xx 编译工具 xx 中英术语的运用风格 xxi 英文术语采用原则 xxii 版面字形风格 xxiii 源码形式与下载 xxiv 在线服务 xxvi 推荐读物 xxvi 第1章 STL 概论与版本简介001 1.1 STL 概论 001 1.1.1 STL的历史 003 1.1.2 STL与C++ 标准程序库 003 . 1.2 STL 六大组件 - 功能与运用 004 1.3 GNU源码开放精神 007 1.4 HP STL实现版本 009 1.5 P.J. Plauger STL实现版本 010 1.6 Rouge Wave STL实现版本 011 1.7 STLport 实现版本 012 1.8 SGI STL实现版本 总览 013 1.8.1 GNU C++ header 文件分布 014 1.8.2 SGI STL 文件分布与简介 016 STL 标准头文件(无扩展名) 017 C++ 标准规格定案前,HP规范的STL头文件(扩展名 .h) 017 SGI STL 内部文件(SGI STL真正实现于此) 018 1.8.3 SGI STL 的组态设定(configuration) 019 1.9可能令你困惑的C++ 语法 026 1.9.1 stl_config.h 中的各种组态 027 组态3:static template member 027 组态5:class template partial specialization 028 组态6:function template partial order 028 组态7:explicit function template arguments 029 组态8:member templates 029 组态10:default template argument depend on previous template parameters 030 组态11:non-type template parameters 031 组态:bound friend template function 032 组态:class template explicit specialization 034 1.9.2 临时对象的产生与运用 036 1.9.3 静态常数整数成员在class 内部直接初始化 037 in-class static const integral data member initialization 1.9.4 increment/decrement/dereference 运算子 037 1.9.5 "前闭后开"区间表示法 [ ) 039 1.9.6 function call运算子(operator()) 040 第2章 空间配置器(allocator) 043 2.1 空间配置器的标准接口 043 2.1.1 设计一个简单的空间配置器,JJ::allocator 044 2.2 具备次配置力(sub-allocation)的SGI 空间配置器 047 2.2.1 SGI 标准的空间配置器,std::allocator 047 2.2.2 SGI 特殊的空间配置器,std::alloc 049 2.2.3 构造和析构基本工具:construct() 和 destroy() 051 2.2.4 空间的配置与释

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧