ACG狂人

其实我更爱姐汁...

记录一下C++标准流感悟

        今天终于完成了自己的日志库核心的几个类和算法,折腾了许久,感觉安全性很好,一些多线程的死锁问题已经逐个排除了。由于需要跟C++标准库的输入输出流共事,所以么总算自认为理解了C++标准流的一些特性,记下来以供备忘。
        首先是文件流,关于该流的问题,要扯就扯远了,主要说一说std::wofstream的问题。不要被这个w骗了,其实它输出到文件上的依然还是那么回事,没有丝毫的变化。如果你是想输出Unicode到文本文件中,那么你最好是用ios::binary模式,然后一股脑的倒入文件中,如果要是使用<<重载符号的话,输出到文件中的跟std::ofstream没区别,而且中文还无法输出。如果你遇见中文无法输出的问题,恩,可以调用std::wofstream::imbue()方法,具体也就是一行:ofs.imbue(std::locale("chs"));搞定。
我想,C++标准库并不支持Unicode编码,而是给字符地域化的编码方式,中文的可能也就是GBK吧,听说C++0x标准会纳入Unicode编码支持,如果是这样的话就省心多了。
        然后还有个不省心的地方就是流的streambuf中的缓冲大小了,我发现,fstream中的写缓冲居然一直是0啊,这个就很头疼了,需要给文件流指定缓冲的大小。

posted on 2009-07-29 23:46 酿妹汁 阅读(996) 评论(2)  编辑 收藏 引用 所属分类: C++备忘

评论

# re: 记录一下C++标准流感悟 2009-10-14 20:45 小罗

楼主,我也遇到 wofstream 记录中英文字符到文件的问题,部分代码如下:

wofstream n_FILE;
n_FILE.open("文件路径...", ios::binary);
n_FILE.imbue(std::locale("chs"));

char* chsFileInfo = new char[iFileSize];
chsFileInfo = 从网络传过来的数据...(数据内容可以包证)
iRecvSize = 网络接收到的数据长度

int nSize = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)chsFileInfo, iRecvSize, 0, 0);
if(nSize <= 0) return NULL;
WCHAR* pwszDst = new WCHAR[nSize+1];
if( NULL == pwszDst) return NULL;
MultiByteToWideChar(CP_OEMCP, 0,(LPCSTR)chsFileInfo, iRecvSize, pwszDst, nSize);
pwszDst[nSize] = 0;
if( pwszDst[0] == 0xFEFF)
for(int i = 0; i < nSize; i ++)
pwszDst[i] = pwszDst[i+1];

n_FILE.write(pwszDst, iRecvSize);


可是记录到文件中的数据会次到是到第一次出现中文的地方后面部分都没有了。
请问楼主有没有解觉的办法?
  回复  更多评论   

# re: 记录一下C++标准流感悟 2009-10-27 21:24

windows的文本文件在存储Unicode编码的字符串时会在一开始加上两个字节的,你可以用记事本保存出来一个Unicode的txt文件看看前面两个字节是什么。  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理