wfstream可以接受宽字符串,之后直接写unicode字串到文件么?

gauldoth 2010-06-29 11:10:22
RT,
向fstream输入多字节字符串,最终会向文件写入多字节字符串。
向wfstream输入unicode字串,设置下locale,它会依据locale将unicode字符串转换成相应的多字节字符串,最终也还是向文件写入多字节字符串。

有没啥比较好的办法直接输入unicode字串,最终也写unicode字串到文件呢?
...全文
318 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Demor 2011-10-25
  • 打赏
  • 举报
回复
wfstream是不是不能向文件写入unicode编码啊?
arong1234 2010-06-30
  • 打赏
  • 举报
回复
二进制直接读写最简单,迫使它不做任何转换
使用fopen系列函数
yunyun1886358 2010-06-30
  • 打赏
  • 举报
回复
自定义locale

#include <locale>
#include <fstream>
using namespace std;

class UniFacet : public codecvt<wchar_t, char, mbstate_t>
{
protected:
virtual result do_in(mbstate_t&, const wchar_t*, const wchar_t*, const wchar_t&, wchar_t, wchar_t* , wchar_t&) const {return noconv;}
virtual result do_out(mbstate_t&, const wchar_t*, const wchar_t*, const wchar_t*, wchar_t*, wchar_t*, wchar_t&) const {return noconv;}
virtual result do_unshift(mbstate_t&, wchar_t*, wchar_t* , wchar_t*) const {return noconv;}
virtual int do_length( mbstate_t& , const wchar_t*, const wchar_t*, size_t) const _THROW0() {return 1;}
virtual bool do_always_noconv() const _THROW0() {return true;}
virtual int do_max_length() const _THROW0() {return 1;}
virtual int do_encoding() const _THROW0() {return 1;}
};

int madin()
{
//建一个Unicode的文本文件。
wchar_t wch[100]=L"a中文Chinese与英文English混排ss\",,可用MultiByteToWideChar转换,也可用mbstowcs转换";
wstring wstr=L"真是折腾人阿!!!";
wofstream UniFile;
UniFile.open("D:\\UniFile.txt",ios::out|ios::binary); //

locale locUni(locale::classic(),new UniFacet);
//这句解释一下,local::classic() 是loccale的一个静态成员函数,他返回一个当前使用的
//locale对象的一个引用,我们现在通过locale的一个构造函数,重新构造一个新的locale对象
//locUni,并把其中codecvt这个facet换成我们自己定义的UniFacet.

UniFile<<UniFile.narrow(0xFF); //设置文件标志;这两是窄字符,一般Unicode文本文件
UniFile<<UniFile.narrow(0xFE); //都以这两个字符作为其起始标志位。

UniFile.imbue(locUni); //改变locale;
UniFile<<wch<<UniFile.widen('\r')<<UniFile.widen('\n'); //回车换行都要宽字符化
UniFile<<wstr<<UniFile.widen('\r')<<UniFile.widen('\n');
UniFile<<"123456"<<UniFile.widen('\r')<<UniFile.widen('\n');
UniFile<<L"ABCDE"<<UniFile.widen('\r')<<UniFile.widen('\n');
UniFile<<34545678<<UniFile.widen('\r')<<UniFile.widen('\n');
UniFile<<L"这样就可以了"<<UniFile.widen('\r')<<UniFile.widen('\n');

UniFile.close();
system("pause");
return 0;
}
gauldoth 2010-06-30
  • 打赏
  • 举报
回复
所有的建议都非常感谢。
我先去看看facet,再仔细想想该咋写。
taodm 2010-06-30
  • 打赏
  • 举报
回复
根据目前的现实,是不要用wfstream
耍宝王 2010-06-30
  • 打赏
  • 举报
回复
不一定要用wfstream,直接用write函数就可以
#include <string>
#include <fstream>
using namespace std;

int main()
{
wstring wstr(L"中文Chinese");
char BOM[] = {'\xFF', '\xFE'};//文件头,用于标示文本文件的格式

ofstream out("test.txt");

out.write(BOM, sizeof(BOM));//将文件头写入文件
out.write((const char*)wstr.c_str(), wstr.size() * sizeof(wchar_t));
out.close();

return 0;
}

如果只是单纯的在文件中写入Unicode字符串的话,可以去掉有注解的那两句(也就是不写入文件标示)

64,666

社区成员

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

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