想把这样一个结构的数据写入文件,是不是不能直接用file.Write写啊?
typedef struct _EventRecord
{
CString Time;
bool IsMessage;
bool IsRun;
CString Path[_MAX_PATH];
CString Message[100];
}EventRecord;
我感觉应该用序列化,查了些资料但是实在看不懂。哪位大虾能帮我写个样例啊?

解决方案 »

  1.   

    这个结构有点问题,因为CString 是类,它的大小是指类的大小,而非time的长度,所以在file.Write中很难控制大小。
      

  2.   

    不好意思啊,我的结构体应该是这样的
    typedef struct _EventRecord
    {
    CString Time;
    bool IsMessage;
    bool IsRun;
    CString Path;
    CString Message;
    }EventRecord;
      

  3.   

    这个结构不能直接写进去,因为象CString的实例都不能真正写入
    调用Write方法写只能把EventRecord地址指向的信息写入
    而CString并不是指向一个字符串指针
    必须分开存

    Write((LPCTSTR)EventRecordTime);
      

  4.   

    当然不能直接用write了。你不知道这个结构有多大啊。
    序列化是可以的。
    typedef struct _EventRecord
    {
    CString Time;
    bool IsMessage;
    bool IsRun;
    CString Path[_MAX_PATH];
    CString Message[100];
        void Serialize(CArchive &ar)
        {            Time.Serialize(ar);
           
           if(ar.IsStoring())
           {
               ar<<isMessage;
               ar<<isRun;
            }
           else
           {
               ar>>isMessage;
               ar>>isRun;
            }
            int i;
            for(i=0;i<_MAX_PATH;i++)
               Path[i].Serialize(ar);
            for(i=0;i<100;i++)
               Message[i].Serialize(ar);
        }
    }EventRecord;
    你后面两个变量是不是应该是char数组啊?怎么是CString数组呢?
      

  5.   

    那个serialize该什么时候调用?怎么调用啊?
      

  6.   


    用CString存不了实际内容,里面指有一个字符的指针,应该改用char重新定义结构
      

  7.   

    现在改为:
    typedef struct _EventRecord
    {
    CString Time;
    bool IsMessage;
    bool IsRun;
    CString Path;
    CString Message;
        void Serialize(CArchive &ar)
        {            Time.Serialize(ar);
           
           if(ar.IsStoring())
           {
               ar<<isMessage;
               ar<<isRun;
            }
           else
           {
               ar>>isMessage;
               ar>>isRun;
            }
            Path.Serialize(ar);
            Message[i].Serialize(ar);
        }
    }EventRecord;
    保存到文件时,这样写:
    EventRecord er;//已经写好内容的结构体
    CFile file;
    file.Open("***.***",CFile::modeWrite);
    CArchive ar(&file,CArchive::store);
    er.Serialize(ar);
    ar.Close();
    file.Close();
    从文件中读取时:
    CFile file;
    file.Open("***.***",CFile::modeRead);
    CArchive ar(&file,CArchive::load);
    EventRecord er;
    er.Serialize(ar);//er就是从文件中读取的结构体
    ar.Close();
    file.Close();
      

  8.   

    为什么报错说 'Serialize' : is not a member of 'CString'啊
      

  9.   

    哦。那你就写成:    void Serialize(CArchive &ar)
        {
           if(ar.IsStoring())
           {
               ar<<Time;
               ar<<isMessage;
               ar<<isRun;
               ar<<Path;
               ar<<Message;
            }
           else
           {
               ar>>Time;
               ar>>isMessage;
               ar>>isRun;
               ar>>Path;
               ar>>Message;
            }
      

  10.   

    sorry。刚才是我写错了。呵呵。
      

  11.   

    那个bool型是不是有问题啊?报错:
    error C2679: binary '>>' : no operator defined which takes a right-hand operand of type 'bool' (or there is no acceptable conversion)
      

  12.   

    bool类型不支持ar
    你可以这样,
    if(ar.IsStoring())
           {
               char ch;
               ar<<Time;
               ch = isMessage;
               ar<<ch;
               ch = isRun;
               ar<<ch;
               ar<<Path;
               ar<<Message;
            }
           else
           {
               char ch;
               ar>>Time;
               ar>>ch;
               isMessage = ch;
               ar>>ch;
               isRun = ch;
               ar>>Path;
               ar>>Message;
            }