导航
  • 主页
  • VC综合技术
  • MFC新技术
  • 互联网技术
  • .NET 技术
  • VC/MFC界面
  • VC/MFC 进程
  • VC/MFC 数据库
  • VC++技术资源

问一个我原以为简单的问题.

ln2503 2010-07-01 01:25:00
以下代码我是在2005下.对话框的一个按钮中实现的
CFile file;
file.Open(_T("1.txt"), CFile::modeCreate|CFile::modeWrite);
CString str=_T("12345678");
file.Write(str,str.GetLength());
file.Close();
结果:在1.txt中只有1234,没有显示完全,为什么啊?

我又试了一下
CStdioFile stdiofile;
stdiofile.Open(_T("1.txt"), CFile::modeCreate|CFile::modeReadWrite);
stdiofile.WriteString(_T("12345678"));
stdiofile.Close();
结果:12345678 ,这就显示完全了.但是我又将第2段代码的12345678改为汉字比如"我是...",结果就是空,什么也写不进去
为什么啊?

搞的我晕了;

...全文
223 点赞 收藏 36
写回复
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
ln2503 2010-07-01
[Quote=引用 34 楼 wltg2001 的回复:]
引用 33 楼 ln2503 的回复:
去网上看了一下,这转换好像并不是很容易啊,代码不少,

确实,用setlocale(LC_CTYPE, "chs" );设置当前本地化信息吧,几行代码就行了。
[/Quote]

回头我也试试,但是第一回见...

谢谢了
回复
ln2503 2010-07-01
我又试了一下
CFile file;
file.Open(_T("1.txt"), CFile::modeCreate|CFile::modeWrite);
CString str=_T("啊12345678");
file.Write(str,2*str.GetLength());
file.Close();
这里就可以显示汉字了;

现在算是问题都解决了;

有空再研究一下多字符的问题吧,

我结贴了

在此谢谢楼上的所有兄弟姐妹.
回复
wltg2001 2010-07-01
[Quote=引用 33 楼 ln2503 的回复:]
去网上看了一下,这转换好像并不是很容易啊,代码不少,
[/Quote]
确实,用setlocale(LC_CTYPE, "chs" );设置当前本地化信息吧,几行代码就行了。
回复
ln2503 2010-07-01
去网上看了一下,这转换好像并不是很容易啊,代码不少,
回复
ln2503 2010-07-01
[Quote=引用 30 楼 priest334 的回复:]
file.Write(str,str.GetLength()); // str内存值 str.GetLength()长度
==>file.Write(str, str.GetLength()*sizeof(TCHAR));

我又将第2段代码的12345678改为汉字比如"我是...",结果就是空
==>UniCode编码方式不能识别汉字,改为多字节编码
[/Quote]

能给个例子吗?麻烦了
回复
ln2503 2010-07-01
[Quote=引用 26 楼 wltg2001 的回复:]
引用 14 楼 ln2503 的回复:
现在的问题是,CFile显示不全,CStdioFile能显示数字和字母.但是不能显示汉字

CFile的问题上面已经说了,主要是UNICODE和CFile对字符计数方式不同造成的,CStdioFile默认情况下不能处理中文,要么用WideCharToMultiByte转,要么像部长所说,用setlocale(LC_CTYPE, "chs" );
当前……
[/Quote]

哦.我明白;
CStdioFile默认情况下不能处理中文,要么用WideCharToMultiByte转
这个我还没接触过,我去查查资料看看.谢谢了啊
回复
priest334 2010-07-01
file.Write(str,str.GetLength()); // str内存值 str.GetLength()长度
==>file.Write(str, str.GetLength()*sizeof(TCHAR));

我又将第2段代码的12345678改为汉字比如"我是...",结果就是空
==>UniCode编码方式不能识别汉字,改为多字节编码
回复
ln2503 2010-07-01
[Quote=引用 27 楼 jay0708 的回复:]
你用的是Unicode字符集吧?把字符集改成使用多字节字符,可以解决这个问题。
或者:
CFile file;
file.Open(_T("1.txt"), CFile::modeCreate|CFile::modeWrite);
CString str=_T("12345678");
file.Write(str,wcslen(str.AllocSysString()));
file……
[/Quote]
我试了一下,.显示的还是1234不完全
回复
yschenwei 2010-07-01
用多字节字符集就好了。
回复
jay0708 2010-07-01
你用的是Unicode字符集吧?把字符集改成使用多字节字符,可以解决这个问题。
或者:
CFile file;
file.Open(_T("1.txt"), CFile::modeCreate|CFile::modeWrite);
CString str=_T("12345678");
file.Write(str,wcslen(str.AllocSysString()));
file.Close();
回复
wltg2001 2010-07-01
[Quote=引用 14 楼 ln2503 的回复:]
现在的问题是,CFile显示不全,CStdioFile能显示数字和字母.但是不能显示汉字
[/Quote]
CFile的问题上面已经说了,主要是UNICODE和CFile对字符计数方式不同造成的,CStdioFile默认情况下不能处理中文,要么用WideCharToMultiByte转,要么像部长所说,用setlocale(LC_CTYPE, "chs" );
当前程序使用的本地化信息。不过这个函数是在locale.h中的,必须要加#include <locale.h>。
回复
ln2503 2010-07-01
还有一个问题就是在CStdioFile写入文件的时候,写入不了汉字,为什么啊,
我要是写汉字就显示0 KB,什么也没有
比如CString str=_T("啊45678"); 显示就为空
但是如果把汉字放到CString str=_T("456啊78"); 显示的就是456。从汉字那截断了
回复
ln2503 2010-07-01
[Quote=引用 20 楼 zxdlms 的回复:]
引用 11 楼 ln2503 的回复:
UNICODE的原因,你将str.GetLength() 改成str.GetLength() * 2 + 1试试!

这样的结果是.1 2 3 4 5 7 8 有空格了
第一个因为Unicode的关系,因为_T("12345678")实际上占了16个字节,而每个字符的第二个字节是0,所以写出来的就有空格了。
[/Quote]

我试了一下好使了.显示完全了,那这么说CFile和CStdioFile处理文字的方式不同了?(不知道说的对不对)
回复
黑泡泡选手 2010-07-01
在主菜单中,打开工程属性对话框,在“字符集”处,取消unicode,就不使用了,但是还是推荐使用吧!
回复
jasonM2008 2010-07-01
[Quote=引用 11 楼 ln2503 的回复:]

UNICODE的原因,你将str.GetLength() 改成str.GetLength() * 2 + 1试试!

这样的结果是.1 2 3 4 5 7 8 有空格了
[/Quote]
因为你UNICODE的原因,你如果想写出来的是ASCII ,就应该这样,
USES_CONVERTION;
strcpy(buf, T2A(LPCTSTR(str)));
file.Write(buf, str.GetLength() + 1);
回复
ln2503 2010-07-01
试了一下VisualEleven的代码.CFile好使了.但是为什么用CString就不好使?
还有在CStdioFile中怎么写?
回复
zxdlms 2010-07-01
[Quote=引用 11 楼 ln2503 的回复:]
UNICODE的原因,你将str.GetLength() 改成str.GetLength() * 2 + 1试试!

这样的结果是.1 2 3 4 5 7 8 有空格了
[/Quote]第一个因为Unicode的关系,因为_T("12345678")实际上占了16个字节,而每个字符的第二个字节是0,所以写出来的就有空格了。
回复
wltg2001 2010-07-01
原因很简单,你是UNICODE工程,所以str.GetLength()返回的是8,但是CFile的Write写入的个数计数方式是字节式的,所以你写成file.Write(str,str.GetLength());这样的话,它只会写入8个字节,但是实际上UNICODE编码下,"12345678"却是16个字节,所以会出现你所说的问题。
改成下面的样子就行了;
file.Write(str,2*str.GetLength());
回复
ln2503 2010-07-01
2005去掉_T就报错.我也不会弄
回复
Eleven 2010-07-01
try
{
CFile file;

file.Open(_T("F:\\11.txt"), CFile::modeCreate | CFile::modeWrite);
char* buf= "你好Hello,World!"
file.Write(buf, strlen(buf));
file.Close();
}
catch(CFileException* e)
{
e->ReportError();
e->Delete();
}
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……