CString做为结构体成员的问题

jinxuliang 2005-10-31 01:30:38
定义了一个如下的结构题
typedef struct
{
int m_i;
CString m_t1;
CString m_t2
} TagStruc;
给它初值后,保存为文件.但是当从新从文件中读到该结构体时,m_t1,m_t2的值没办法得到.且不能进行任何赋值,断言说是无效指针.我想这是因为CString 不能确定其长度造成的.
请求解决办法.
就是说我给结构体
cc.m_i=4;
cc.m_t1="dfasdf";
cc.m_t2=" asdfasf";
把cc存如文件dd.dat后,再从cc.dat中读出来,cc的值不变.谢谢
...全文
603 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinxuliang 2005-10-31
  • 打赏
  • 举报
回复
感谢大家.揭贴了.用序列化
ihavenoidea(正) ( )不错的办法
xlz45 2005-10-31
  • 打赏
  • 举报
回复
MFC的序列化是个不错的解决方案.

ihavenoidea 2005-10-31
  • 打赏
  • 举报
回复
分呢 分呢 俺要分撒!
ihavenoidea 2005-10-31
  • 打赏
  • 举报
回复

struct SS
{
int m_i;
CString m_t1;
CString m_t2;
void Serialize(CArchive &ar)
{
if(ar.IsStoring())
{
ar<<m_i;
ar<<m_t1;
ar<<m_t2;;
}
else
{
ar>>m_i;
ar>>m_t1;
ar>>m_t2;
}
}
};
/* store

CFile file("1.txt",CFile::modeCreate|CFile::modeReadWrite);
CArchive ar(&file,CArchive::store);
SS s;s.m_i = 2;s.m_t1 = "ddd"; s.m_t2 = "333";
s.Serialize(ar);
ar.Close();
*/
/* load
CFile file("1.txt",CFile::modeReadWrite);
CArchive ar(&file,CArchive::load);
SS s;
s.Serialize(ar);
ar.Close();
*/
yayaniuniu502 2005-10-31
  • 打赏
  • 举报
回复
思路是没有问题的,你在打开文件写完以后,!!!关闭程序!!!,读出来的文件才是更新后的文件
jinxuliang 2005-10-31
  • 打赏
  • 举报
回复
好,用序列化.
teli_eurydice 2005-10-31
  • 打赏
  • 举报
回复
typedef struct
{
int m_i;
CString m_t1;
CString m_t2

Serialize(CArchive &ar)
{
if(ar.IsStoring())
{

}
else
{

}
} TagStruc;
teli_eurydice 2005-10-31
  • 打赏
  • 举报
回复
不是说过了吗,加个序列化就可以了
ihavenoidea 2005-10-31
  • 打赏
  • 举报
回复
同意仙人掌 ,加个序列化就行了.
laofang 2005-10-31
  • 打赏
  • 举报
回复
结构体中的CString应用字符数据替换:

typedef struct
{
int m_i;
char m_t1[255];
...
}TagStruc;
jinxuliang 2005-10-31
  • 打赏
  • 举报
回复
各位老大:
当初没想那么多,只图方便.已经弄成这个样子了.请大家指教点方便的补救措施.
nZAI(就是多线程) (的方法还可以,个人认为哈.
ihavenoidea 2005-10-31
  • 打赏
  • 举报
回复
接分撒!:)
teli_eurydice 2005-10-31
  • 打赏
  • 举报
回复
要不换成 Char*
teli_eurydice 2005-10-31
  • 打赏
  • 举报
回复
CString 的内存不是连续的,你自己写序列化好了,序列化的时候直接调用

typedef struct
{
int m_i;
CString m_t1;
CString m_t2

Serialize(CArchive &ar)
{
if(ar.IsStoring())
{

}
else
{

}
} TagStruc;
ihavenoidea 2005-10-31
  • 打赏
  • 举报
回复
肯定错拉!~~
sizeof 得到的确是字符串实际大小
但是每个CString 都有一个隐藏的辅助结构,在字符串前面CStringData
它会在你调用cstring的一些成员函数时自动设置.
而你调用的Read操作实际上类似于,对CString实施了memcpy ,不经过CStringData,于是那个CString是不完整的----只包含了原始字符串,没有辅助的信息(位于原始字符串的地址前面)

所以,在初始化CString 时,要用它本身的成员函数.
nZAI 2005-10-31
  • 打赏
  • 举报
回复
看你的存取代码是对定长字符串进行操作的,直接把CString作为结构体成员肯定不妥,因为CString是变长的,建议你在存储时先转换为char[],再存,读取的时候反过来,先读入char[],再构造CString
快乐鹦鹉 2005-10-31
  • 打赏
  • 举报
回复
sizeof(struct FARSTRUCT TagStruc)这是有问题的。CString类型你用sizeof是得不到字符串的实际大小的。
菲斯可儿 2005-10-31
  • 打赏
  • 举报
回复
还是用char*吧.
jinxuliang 2005-10-31
  • 打赏
  • 举报
回复
补充说明:
写文件是这样写的:
m_pFile.Write(PepoleRealRun,MAX_PEPOLE_NUMBER*sizeof(struct FARSTRUCT TagStruc));
读文件是雷同:
m_pFile.Read(PepoleRealRun,MAX_PEPOLE_NUMBER*sizeof(struct FARSTRUCT TagStruc));

我在想是不是可以在程序初始化的时候指定CString 变量的大小.在写的时候也指定.读写保持其大小一致,是否能解决这个问题?程序已经写好了,就这个地方有问题,如果改动的话,好麻烦哦?请大家指点高招.

goodboyws 2005-10-31
  • 打赏
  • 举报
回复
CString做为结构体成员,肯定不能对结构体成员进行memcpy
也不能通过强制类型转换获得结构体指针,因为这样的话你没有调用CString的构造函数
加载更多回复(5)

16,551

社区成员

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

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

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