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

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改为汉字比如"我是...",结果就是空,什么也写不进去
为什么啊?

搞的我晕了;

...全文
281 36 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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();
}
加载更多回复(16)

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

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