我有一个类:
class CTest : public CObject  
{
public:
CTest();
virtual ~CTest();
int i;
};
可以使用如下方法存取数据:
写数据: CTest myTest;
myTest.i = 5; FILE* fp;
if ((fp = fopen("test.dat","wb")) != NULL)
{
fwrite(&myTest,sizeof(CTest),1,fp);
fclose(fp);
}
读数据:
CTest myTest; FILE* fp;
if ((fp = fopen("test.dat","rb")) != NULL)
{
fread(&myTest,sizeof(CTest),1,fp);
fclose(fp);
}
但是如果我将类的定义中添加一个CString的变量,同样的操作将不能成功。
class CTest : public CObject  
{
public:
CTest();
virtual ~CTest();
CString szName;  //此行添加CString的成员变量,
int i;
};
我估计是CString的大小无法固定产生的问题,麻烦高手指点,并给出解决的方法。多谢!!

解决方案 »

  1.   

    use CString::GetLength() to get its length ,and pass it to fwrite as argumentm_Str.GetLength()
      

  2.   

    fwrite((LPCTSTR)szName,szName.GetLength(),1,fp);
      

  3.   

    类里面有CString szName
    sizeof(szName)并不代表CString的实际长度。要注意哦
      

  4.   

    大家看的用法:fread(&myTest,sizeof(CTest),1,fp);
    我是将一个类(CTest)的实例写入文件,而不是依次写入CTest里面的那些成员函数哟。
      

  5.   

    我是将一个类(CTest)的实例写入文件,而不是依次写入CTest里面的那些成员函数哟。++++++++++++++++++++++++
    对于类里面的类实例来说,就是要一个一个依次来写入的。
      

  6.   

    class CTest : public CObject  
    {
    DECLARE_SERIAL(CTest);
    public:
             
    CTest();//实现序列化需要有缺省的构造函数
              virtual ~CTest();
             void Serialize(CArchive &ar);
             CString szName; 
    int i;
    };
    IMPLEMENT_SERIAL(CTest,CObject,0)
      

  7.   

    fwrite((LPCTSTR)szName,szName.GetLength(),1,fp);
    ///////////////第二和第三个参数反了
      

  8.   

    fwrite((LPSTR)(LPCTSTR)szName,szName.GetLength(),1,fp);
      

  9.   

    序列化是最好的了,也可以重载fread,fwrite函数(以下签名由MyCSDN回复工具生成)
    -----------------------------------------------
    pinel