EVC中写文件奇怪的乱码,每两个字符之间都多了个00(空格)(在VC6下正常,在EVC下出错)

cql0007 2006-12-04 02:31:59
在EVC下用CFile写一段文本文件,写出来的却是奇怪的格式的。代码如下:
CFile file;
CString cstrTemp;

if(file.Open(sTmp+"new.txt",CFile::modeCreate | CFile::modeReadWrite|CFile::modeNoTruncate))
{

cstrTemp.Format(_T("Hockey is best!"));
file.Seek(0,CFile::end);
file.Write(cstrTemp, cstrTemp.GetLength());
file.Flush();
file.Close();
}

上面这段代码在VC6。0下运行结果正常,会创建一个new.txt文件,并写入文本。
但上面这段代码在EVC下就莫明其妙了,上面这段代码只会写入一半的字符,也就是说只会写入Hockey i这几个,而且每两个字符之间都会多出一个字节00,结果写出来的为H o c k e y i。每两个字符之间都会多出一个空格来,这个时候我把
file.Write(cstrTemp, cstrTemp.GetLength());这句改成:
file.Write(cstrTemp, cstrTemp.GetLength()*2);就能把要写的字符全部写完,只是每两个字符之间多了个空格,请问这是怎么回事?该如何解决?

(new.txt如果是用记事本看显示是正常的,只有用ultraEdit才看的出中间多了个空格了)
...全文
271 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Pipi0714 2006-12-05
  • 打赏
  • 举报
回复
wince 是UNICODE

每个字符用两个字节存储
无聊客 2006-12-05
  • 打赏
  • 举报
回复
晕,看错题目,你是要在PC上结果是吧,那用WideCharToMultiByte转换一下啊;
比如
TCHAR szText[MAX_PATH];
char szTextConv[MAX_PATH];
int count = MAX_PATH;
::GetWindowText(hWnd, szText,...);

::WideCharToMultiByte(CP_ACP, 0, szText, -1, szTextConv, (int)count, NULL, NULL);

再用szTextConv写文件
cql0007 2006-12-05
  • 打赏
  • 举报
回复
多谢楼上老兄。
用TCHAR这样写出来还是一样了,还是中间加空格的
TCHAR* sz = _T("123456 abcdefg");
int iLen = wcslen(sz);

file.Seek(0,CFile::end);
file.Write(sz,iLen);
file.Flush();
file.Close();
得到的结果还是1 2 3 4 5 6
现在只有用
char* buf = new char[100];
sprintf(buf,"%s","123456 abcdefg");
file.wirte(buf,100);
这样写出来的才是正常的结果,不过如果用:
sprintf(buf,"%s",cstrTemp);//我要写的字符串先定义好了成一个CString的,那出来的结果又出错了。
请各位高手再帮忙看看这段代码到底要如何写才可以了?非常感谢了
无聊客 2006-12-05
  • 打赏
  • 举报
回复
你可以使用TCHAR,详细定义在tchar.h里面,对应字符串操作也要用tchar系列的,这些宏定义都在tchar.h里面找到,一看就明白
用TCHAR的好处是,你可以自由的在UNICODE和非UNICODE程序中切换,只需要控制UNICODE宏就可以了,使用方法比如:
TCHAR* szText = _T("abc");
int iLen = _tcslen(szText);
在UNICODE环境下,它相当于:
WCHAR* szText = L"abc";
int iLen = wcslen(szText);

在非UNICODE环境下等于:
char* szText = "abc";
int iLen = strlen(szText);
cql0007 2006-12-05
  • 打赏
  • 举报
回复
非常感谢老兄,问题解决了
无聊客 2006-12-05
  • 打赏
  • 举报
回复
你的sz2只是根指针,空间都没分配,怎么能不挂。。。。。。。
cql0007 2006-12-05
  • 打赏
  • 举报
回复
非常感谢yzx0023(无聊客)

用你的方法终于可以写成我想要的编码文字了,不过又出现了另外一个莫明其妙的问题,请再帮我看看
CString cstrTemp(这是个传出来的CString,里面就是我要写的内容)
const TCHAR* sz = T2CW(cstrTemp);
int iLen = _tcslen(sz);
char* sz2;
WideCharToMultiByte(CP_ACP, 0, sz, -1, sz2, iLen, NULL, NULL);
file.Seek(0,CFile::end);
file.Write(sz2,iLen);
file.Close();
这样写写的结果是正常的,但是程序执行完这几句的时候,PDA的屏幕窗口居然会是一个死屏的状态,它的周围的按钮可以操作,但它屏幕中间我绘制的部分全变成白的了,啥都没有了,也都不能操作了,但文件是写进去了,写进去的格式也是我想要的。
关键在这句:WideCharToMultiByte(CP_ACP, 0, sz, -1, sz2, iLen, NULL, NULL);
注释了这句就显示正常了,但写进去的文件带00,有了这句写的正常但屏幕显示不正常??
cql0007 2006-12-04
  • 打赏
  • 举报
回复
老大,我就是不知道在代码里,在程序里怎么处理啊
ppcat_001 2006-12-04
  • 打赏
  • 举报
回复
那就自己把buf里面的00删掉后再写
顺便bs一下那个写"别的系统"的
cql0007 2006-12-04
  • 打赏
  • 举报
回复
我在PDA里写入的文件要给别的系统调用了,多了个00,别的系统调用出错了,读那个文件是已有的系统了,只是让我这个new.txt按正确的格式生成了。

另外,我也不是一定要用char,我只要能将这个数据写正确就可以了。我不是做EVC和VC的,所以我也是参照些别人VC的例子拿着几个搞法在试来试去的啊,苦了
ppcat_001 2006-12-04
  • 打赏
  • 举报
回复
如果你非要用char就只能char* buf = new char[cstrTemp.GetLength()*2]了
不用担心new.txt里面的00,只要你知道是按UNICODE存储的就行,下次用的时候在做处理
建议你用TCHAR试一试。
cql0007 2006-12-04
  • 打赏
  • 举报
回复
已经弄明白问题是因为编码问题产生的了,问题是我的这段代码该如何改才可以解决这个问题了?

char buf[100];
sprintf(buf, "%s", "12121212 abababab");
直接写buf得到的结果就是对的。

但是我这样写:
//char* buf = new char[cstrTemp.GetLength()];
//sprintf(buf,"%s",cstrTemp);
得到的结果还是开始那样的结果,因为我要写的内容cstrTemp是从对话框里读到了,有N个字段合起来的,怎么把我的cstrTemp转换成我需要的正确的格式的char*写进去了?
ppcat_001 2006-12-04
  • 打赏
  • 举报
回复
yzx0023说的很清楚了
CE是UNICODE,每个字符自动分配2个字节,像ASCI字符这种只占用1个字节的就自动用0补齐,至于记事本,是支持UNICODE的,所以你看不到。
cql0007 2006-12-04
  • 打赏
  • 举报
回复
请问这里该如何解决了?我本来不是做VC的,接手改一段EVC的代码,搞的头痛啊,楼上老大可否详细指点一二?
无聊客 2006-12-04
  • 打赏
  • 举报
回复
注意CE是UNICODE

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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