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

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

有没啥比较好的办法直接输入unicode字串,最终也写unicode字串到文件呢?
...全文
359 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字符串的话,可以去掉有注解的那两句(也就是不写入文件标示)
内容概要:本文系统研究了构网型变流器的正负序阻抗解耦特性及其在弱电网环境下的稳定性表现,重点依托Matlab/Simulink仿真平台,构建了详细的阻抗数学模型,设计了解耦控制策略,并采用小信号扫频法进行频域辨识与稳定性验证。研究深入探讨了构网型变流器与传统跟网型逆变器在正负序阻抗特性上的本质差异,结合虚拟同步发电机(VSG)等先进控制技术,分析其在抑制频带振荡、削弱锁相环动态耦合等方面的优越性。文中不仅提供了完整的仿真模型与MATLAB代码实现,还整合了光伏、风电、储能、微电网等多类新能源系统的阻抗建模与稳定性分析资源,形成了一套面向新型电力系统稳定性的综合性技术资料体系,具有较强的科研复现与工程参考价值。; 适合人群:面向具备电力电子、电力系统自动化、新能源并网等专业背景的研究生、高校教师及工程技术人员,特别适用于从事阻抗建模、小干扰稳定性分析、频振荡机理研究以及撰高水平学术论文的科研工作者。; 使用场景及目标:①掌握构网型变流器正负序阻抗建模与扫频辨识的仿真方法;②深入理解VSG等构网型控制在弱电网中提升稳定性的内在机理;③复现顶刊论文中的阻抗分析流程与稳定性判据应用;④利用提供的成熟模型与代码加速科研进程,支撑课题研究与学术成果产出。; 阅读建议:建议结合文中提供的Simulink模型与MATLAB代码,按照“理论建模—仿真搭建—扫频激励—频响提取—Nyquist判据分析”的完整流程进行实践操作,重点关注扫频信号的注入方式、频率范围设置及阻抗曲线的物理意义解读,并参考博士论文复现案例深化对复杂动态耦合问题的理解。

65,211

社区成员

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

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