Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源
文章的前提:
1. 使用ReadString来读取字符串. sizeof(TCHAR) == 2 为 wchar_t. // 原因通常TCHAR == char时,通常使用不会有问题发生,所以文章不再讨论。
2. 读本文之前,建议先读一下WriteString写入的总结: http://blog.csdn.net/chunyexiyu/article/details/8938540 里面的内容和这个ReadString关联比较大,里面有介绍原理性的东西。
这种情况下,使用ReadString读入效果不理想,详见下面说明:
utf8/ansi情况下,不能使用binary打开然后ReadString,因为这种模式下,一次按照TCHAR的大小,读取两个字符,结束符号0d的话,需要读取到0x 0d 00才会认为是读取一行结束。而我们知道untf8/ansi情况存储的话,里面是没有0x00存在的。
utf8/ansi情况下,使用typetext打开然后ReadString,可以把字符读入到CString里面,但存储是按照每次存一个字节到TCHAR中的。
CString里面存储的信息为:每个TCHAR存储一个字节的信息(Char)
例如:文件有100个字节,同时包含有种英文,读入到CString种,就会是100个长度
例如:ASNI格式的内容 abc内蒙古 (0x61 62 63 C4 DA C3 C9 B9 C5) 3+2*3 =9
typetext读入到CString种,长度为9,CString转TCHAR*的字符串为
61 00 (little endian,低字节在前,高字节在后)
62 00
63 00
C4 00
DA 00
C3 00
C9 00
B9 00
C5 00
utf8/ansi文件情况下,建议使用Binary打开,然后使用Read来读取,一个字节一个字节的读取,直到读取到'\0'为止,这样就能读取一个完整的uft8/ansi字符串。再把这个字符串转换成unciode赋值给CString变量。
这种情况下,使用binary方式读入效果比较理想:
unicode情况下:不能使用typetext方式打开ReadString,因为unicode下,文件中的内容 如abc在文件中存储为 61 00 62 00 63 00,ReadString在typetext模式下,一个字节一个字节来读入到CString中,遇到0x00,读入到CString就异常了,就不是我们想要的了。CString中是不能再中间某一位存储0x00的。
unicode模式下,建议使用binary模式打开ReadString,先seek到第3个字节(前两个字节是unicode的标示符号),然后使用ReadString来读取。Binary模式下,是按照TCHAR的大小,一次读取两个字符,这样就不存在一个一个字符读取到0x00的问题。