Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1495942
  • 博文数量: 218
  • 博客积分: 6394
  • 博客等级: 准将
  • 技术积分: 2563
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-08 15:33
个人简介

持之以恒

文章分类

全部博文(218)

文章存档

2013年(8)

2012年(2)

2011年(21)

2010年(55)

2009年(116)

2008年(16)

分类:

2009-12-11 21:44:35

这两天一直被中文写入的问题困扰,现在解决了,写了个例子,分析了一下,呵呵

#pragma once
#include
#include
#include
#include
#include
#include
#include
#include

struct CStudent
{
 int ID;
 int age;
 std::wstring name;
 std::string name1;
 double math;
 double english;
 friend std::wostream & operator<<(std::wostream & os,const CStudent & object);
 friend std::ostream & operator<<(std::ostream & os,const CStudent & object);
};


std::wostream & operator<<(std::wostream & os,const CStudent & object)
{
 os< std::locale & oldLocal = os.imbue(std::locale(std::locale::locale("chs"),"",LC_CTYPE));
 if (object.name.length() == 0)
 {
  os< }
 else
 {
  os<  //os< }
 os<<",";
 os.imbue(oldLocal);
 os< return os;
}

std::ostream & operator<<(std::ostream & os,const CStudent & object)
{
 os< if (object.name1.length() == 0)
 {
  os<<"无名";//注意这里没有L
 }
 else
 {
  os< }
 os<<",";
 os< return os;
}

class COutPutStudent
{
private:
 std::vector m_StudentVec;
 std::wofstream m_WFileStream;
 std::ofstream m_FileStream;
public:
 void Init();
 void Finish();
 void WriteFile();
 void WriteHeader();
 void WriteContent();
};

void COutPutStudent::Init()
{
 m_StudentVec.clear();
 CStudent A,B;
 A.ID = 1;
 A.age = 23;
 A.english = 85;
 A.math = 95;
 m_StudentVec.push_back(A);

 B.ID = 2;
 B.age = 24;
 B.name = L"小王";
 B.name1 = "小王";
 B.english = 75;
 B.math = 86;
 m_StudentVec.push_back(B);

 m_WFileStream.open(L"测试W.csv",std::ios_base::out);
 if (!m_WFileStream)
 {
  ::OutputDebugStr(L"文件流出错");
 }
 m_FileStream.open(L"测试.csv",std::ios_base::out);
 if (!m_FileStream)
 {
  ::OutputDebugStr(L"文件流出错");
 }
}

void COutPutStudent::WriteHeader()
{
 m_WFileStream<<"学号"<<","<<"年龄"<<","<<"姓名"<<","<<"数学成绩"<<","<<"英语成绩"< //注意这里都没有加相应的L
 m_FileStream<<"学号"<<","<<"年龄"<<","<<"姓名"<<","<<"数学成绩"<<","<<"英语成绩"<}

void COutPutStudent::WriteContent()
{
 for (std::vector::const_iterator m_StudentVecIt = m_StudentVec.begin();m_StudentVecIt != m_StudentVec.end();m_StudentVecIt++)
 {
  m_WFileStream<<(*m_StudentVecIt);
 }
 for (std::vector::const_iterator m_StudentVecIt = m_StudentVec.begin();m_StudentVecIt != m_StudentVec.end();m_StudentVecIt++)
 {
  m_FileStream<<(*m_StudentVecIt);
 }
}

void COutPutStudent::WriteFile()
{
 WriteHeader();
 WriteContent();
}

void TestCout()
{
 std::cout<<"cout中文测试"< std::wcout<<"wcout中文测试"< std::wcout< std::wcout.clear();
 std::locale oldLocale = std::wcout.imbue(std::locale(std::locale("chs"),"",LC_CTYPE));
 std::wcout< std::wcout.imbue(oldLocale);
 std::cout<<"===================================================="< std::string str = "cout中文测试";
 std::cout< std::wstring wstr = L"lwcout中文测试";
 //std::wcout< std::wcout< std::wcout.clear();
 std::locale oldLocale1 = std::wcout.imbue(std::locale(std::locale("chs"),"",LC_CTYPE));
 std::wcout< std::wcout.imbue(oldLocale1);
}

int main(void)
{
 TestCout();
 COutPutStudent ST;
 ST.Init();
 ST.WriteFile();//两个都正常写入文件
 getchar();
}

VS2005 + SP1上测试通过,不能保证其他的平台上也适用~·~
关于文件输出汉语的一些结论:
(1)std::ofstream 支持中文的文件名,可以正常的写入中文(MBCS编码)==>std::string类型
(2)std::wofstream 支持中文的文件名,可以正常的写入中文常量(不带L),如果是带上L的话,需要将Locale设置成"chs"模式,对应std::wstring类型的变量(包含中文)写入文件时,一定要将Locale设置成"chs"模式,否则不能正常写入。
(3)宽字符的流(前面带w的)==>支持按照MBCS写文件,但是仅仅局限于常量比如std::wcout<<"wcout测试";对于MBCS的变量(std::string)来说将会产生编译错误,例:std::string str = "中文";std::wcout<(4)对于宽字符的流如果是指明使用Unicode的话(std::wstring),就需要相应的设置区域了,调用相应的imbue方法
(5)总结一般的读写文件使用std::ofstream就行了,支持汉语,==>包括文件名,和文件写入,呵呵
我原来还有两篇文章是说MBCS、Unicode以及中文写入文件的这两篇文章都是转的,呵呵
解决UNICODE字符集下无法写入中文的问题:主要是使用CRT中的CLocale(因为是使用的MFC中的CStdioFile和WinCE平台上的),对于XP上C++中的各种流使用CLocale应该是不起作用的!
http://blog.chinaunix.net/u2/61062/showart_2055245.html
字符,字节和编码(转) :主要是说明各种的编码的问题
关于CLocale和c++中的std::locale对象的区别,有一篇文章:呵呵
另外:CRT(CRun time)没有c++版的,只有相应的STL
C++的runtime包括CRT和相应的STL,所以我觉得这两个(CRT和STL)是并列的,所以这可能就是CLocale为什么不起作用的原因吧
阅读(12846) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-12-12 16:00:56

顶了

chinaunix网友2009-12-12 16:00:50

顶了