我把一个结构体写入文件,为什么读出来就成了乱码啦?
结构体是这样的:
struct infor
{
CString name;
int age;
int classes;
}
infor *myinfor = new infor;
CFile myfile;
写入过程:
myfile.Write(myinfor,sizeof(infor));
读过程:
myfilr.Read(myinfor,sizeof(infor));
等我在读的时候,读出来的结构体内部变量的int型都是正确,但是CString就成了乱码了,这是怎么回事啊?
问题点数:20、回复次数:9Top
1 楼mensong(吉他乐手)回复于 2002-01-31 10:30:55 得分 0
老兄,你的语言设定没有设为中文吧?Top
2 楼SauMa(笨笨)回复于 2002-01-31 10:32:24 得分 0
我写入得是英文Top
3 楼eion(那个谁)回复于 2002-01-31 10:43:09 得分 10
废话
你看看CString的定义,里面有
LPTSTR m_pchData; // pointer to ref counted string data
也就是说它是用指针来保存数据的,
你直接记录结构体的内容是没有任何意义的【存储的是地址的值,不是数据内容】
所以因该将CString的内容读出来再写,或者用CString的operator<<Top
4 楼eion(那个谁)回复于 2002-01-31 10:45:32 得分 0
struct CStringData
{
long nRefs; // reference count
int nDataLength; // length of data (including terminator)
int nAllocLength; // length of allocation
// TCHAR data[nAllocLength]
TCHAR* data() // TCHAR* to managed data
{ return (TCHAR*)(this+1); }
};
class CString
{
.......................
protected:
LPTSTR m_pchData; // pointer to ref counted string data
// implementation helpers
CStringData* GetData() const;
................
}Top
5 楼SauMa(笨笨)回复于 2002-01-31 11:01:49 得分 0
那我要怎么办咧?Top
6 楼bskay() bskay() bskay()回复于 2002-01-31 11:35:26 得分 10
CString name;的问题 (它相当于 char*)
应该用 char 数组
你的struct包含CString 对象
而你的写入过程:
myfile.Write(myinfor,sizeof(infor));总是写入了 char* 的地址而非char* 所指的内容 :)
读过程:
myfile.Read(myinfor,sizeof(infor));当然就不对了
可以用OOP的方法
struct sInformation
{
CString _strName;
int _nAge;
int _nClasses;
void ReadFromFile(CFile& file);
void Write2File((CFile& file);
};
写入过程:
myinfor.Write2File(myfile);
读过程:
myinfor.ReadFromFile(myfile);
sInformation::ReadFromFile(CFile& file)
{
...
}
sInformation::Write2File((CFile& file);
{
...
};
Top
7 楼eion(那个谁)回复于 2002-01-31 16:04:43 得分 0
write:
CString s="abcsdfasfas";
int len = strlen((char*)s);
fwrite(&len,sizeof(int),....);
fwrite(s.GetBuffer(len),len,.....);
read:
char buf[1024];
int len=0;
fread(&len,sizeof(int),.....);
if( len>0 ) fread(buf,len,....);
buf[len]=0;
CString s = buf;
.....................Top
8 楼SauMa(笨笨)回复于 2002-01-31 17:20:48 得分 0
多谢各位,我找到方法了!Top
9 楼zyoujie()回复于 2002-01-31 17:38:23 得分 0
恭喜Top




