我声明的一个结构struct Data{    CString name;
    int num;
   
}Data  list[400];内存映射写到硬盘后,再映射到内存,CString name数据是“错误的指针”,而num正确。
请教是否由于CString name 只是一个“指针”,内存映射文件中不能包含CString成员?是否有方法,写盘时,把数据CString name写入硬盘。我整个代码用的CString name,改char工作量太大。

解决方案 »

  1.   

    CString中的数据部分应该是存放在另外的地方,所以会产生你上面所说的问题,还是用char数组吧
      

  2.   

    不仅仅是CString,任何带指针的都不行,指针保存到文件中,到另外一个进程怎么可能有意义
      

  3.   

    我估计可能存放的CString是指针,num是数据,存放之后你的Data list[400];只是函数里的自动变量,执行完之后就释放了内存,所以就失败,可以试一下用new开辟堆来存放数据,然后再读取
      

  4.   

    CString是类,它的成员变量是属于结构体的,但是成员函数new出来的内存是不属于结构体的。CString的成员变量并不保存实际的字符串,只是一个指针而已。因此你对指针赋予字符串的值,必然导致错误。这里应该使用char数组,不要使用类
      

  5.   

    上面的已经说出了问题所在。
    可以再包装一个MyString,里面包含字符串数组,可以用模板实现不同长度的字符串数组节省空间。
    类似MyString<5> string5; 定义5个字符长度
      

  6.   

    告诉你第一点,使用映射文件操作小量数据比正常文件IO还要慢!告诉你第二点,如果你要使用映射文件,你可以这样做:
    1) 从CFile派生自己的类,内部执行映射文件IO。
    class CMyFileMappingClass : public CFile
    {
    public:
    virtual UINT Read(void* lpBuf, UINT nCount);
    virtual void Write(const void* lpBuf, UINT nCount);
    virtual ULONGLONG GetLength() const;
    virtual ULONGLONG Seek(LONGLONG lOff,UINT nFrom);
    ....!!!!
    };2) 重载包含CString成员的那个类的Serialize()函数。
    void CYourClass::Serialize(CArchive& ar)
    {
    CObject::Serialize(ar);
    if (ar.IsStoring())
    {
     // 存储持久性对象到档案
    ar << MyCStringObject;
    }
    else
    {
     // 从档案装载持久性对象
    }3) 把这个CMyFileMappingClass送给CArchive。
    CMyFileMappingClass file;
    file.Open(....);
    CArchive ar(&file, CArchive::store);
    Serialize(ar); //启动序列化。
      

  7.   


    你可以使用CString,但你必须手动序列化来保存里面的数据.