typedef struct tagMBLIMAGEHEADER
{
DWORD FileSize;
DWORD SrcSizeInPixel;
long SrcWidthInPixel;
long SrcHeightInPixel;
ImgRect ImgArea; //这也是结构体,定义见上面
WORD MidTierNum;
WORD BitCount;
WORD RgbTableSize;
TierHeaStruList TierHeaList; //CList链表定义见上面
}MBLIMAGEHEADER;
以下是ImgRect和TierHeaStruList的定义:
typedef struct tagImgRect{
POINT LefDowCoordinate;
POINT RigTopCoordinate;
}ImgRect;typedef struct tagTierHeadStru{
DWORD TierOffset;
DWORD Resolution;
}TierHeaStru;typedef CList<TierHeaStru, TierHeaStru&> TierHeaStruList;
{
DWORD FileSize;
DWORD SrcSizeInPixel;
long SrcWidthInPixel;
long SrcHeightInPixel;
ImgRect ImgArea; //这也是结构体,定义见上面
WORD MidTierNum;
WORD BitCount;
WORD RgbTableSize;
TierHeaStruList TierHeaList; //CList链表定义见上面
}MBLIMAGEHEADER;
以下是ImgRect和TierHeaStruList的定义:
typedef struct tagImgRect{
POINT LefDowCoordinate;
POINT RigTopCoordinate;
}ImgRect;typedef struct tagTierHeadStru{
DWORD TierOffset;
DWORD Resolution;
}TierHeaStru;typedef CList<TierHeaStru, TierHeaStru&> TierHeaStruList;
sizeof(TierHeaStruList),但它的成员变量所指向的内存块的数据都未写到文件里。
我是用的内存映射文件写数据,所以我直接用的是memcpy写数据因为在TierHeaStruList里的数据在内存里肯定不是连续的,所有我把这个结构体里包含的数据,包括CList里面的,都重新拷到一段连续的内存里面。然后用这段内存的地址作为memcpy的源地址,内存映射返回的地址作为目标地址,就是这个大小,不知道该怎么计算??
{
DWORD FileSize;
DWORD SrcSizeInPixel;
long SrcWidthInPixel;
long SrcHeightInPixel;
ImgRect ImgArea; //这也是结构体,定义见上面
WORD MidTierNum;
WORD BitCount;
WORD RgbTableSize;
TierHeaStruList TierHeaList; //CList链表定义见上面
}MBLIMAGEHEADER;
以下是ImgRect和TierHeaStruList的定义:
typedef struct tagImgRect{
POINT LefDowCoordinate;
POINT RigTopCoordinate;
}ImgRect;typedef struct tagTierHeadStru{
DWORD TierOffset;
DWORD Resolution;
}TierHeaStru;typedef CList<TierHeaStru, TierHeaStru&> TierHeaStruList;----------------------------------------------------------------------------sizeof是编译的时候确定大小,与CList中容纳了多少个节点数量无关。sizeof( MBLIMAGEHEADER ) 我不明白你这样的sizeof究竟能用来干什么?要copymemory复制数据吗?
例如:
struct
{
short a;
}T;
T data;
假设按4个字节对齐,设sizeof(T)=4如果你写入文件时用的是WriteFile(hFile, &data, sizeof(data), ...);则写入4个字节,会将系统填充字节写入。
如果写入文件时用的是WriteFile(hFile, &data.a, sizeof(data.a),...); 则只写入2个字节。如果存储空间足够,一般不用考虑此类问题,只要保证写数据的方式与读数据的方式一致就可以了。
class CList : public CObject
{
protected:
struct CNode
{
CNode* pNext;
CNode* pPrev;
TYPE data;
};
public:
// Construction
/* explicit */ CList(INT_PTR nBlockSize = 10);// Attributes (head and tail)
// count of elements
INT_PTR GetCount() const;
INT_PTR GetSize() const;
BOOL IsEmpty() const; // peek at head or tail
TYPE& GetHead();
const TYPE& GetHead() const;
TYPE& GetTail();
const TYPE& GetTail() const;// Operations
// get head or tail (and remove it) - don't call on empty list !
TYPE RemoveHead();
TYPE RemoveTail(); // add before head or after tail
POSITION AddHead(ARG_TYPE newElement);
POSITION AddTail(ARG_TYPE newElement); // add another list of elements before head or after tail
void AddHead(CList* pNewList);
void AddTail(CList* pNewList); // remove all elements
void RemoveAll(); // iteration
POSITION GetHeadPosition() const;
POSITION GetTailPosition() const;
TYPE& GetNext(POSITION& rPosition); // return *Position++
const TYPE& GetNext(POSITION& rPosition) const; // return *Position++
TYPE& GetPrev(POSITION& rPosition); // return *Position--
const TYPE& GetPrev(POSITION& rPosition) const; // return *Position-- // getting/modifying an element at a given position
TYPE& GetAt(POSITION position);
const TYPE& GetAt(POSITION position) const;
void SetAt(POSITION pos, ARG_TYPE newElement);
void RemoveAt(POSITION position); // inserting before or after a given position
POSITION InsertBefore(POSITION position, ARG_TYPE newElement);
POSITION InsertAfter(POSITION position, ARG_TYPE newElement); // helper functions (note: O(n) speed)
POSITION Find(ARG_TYPE searchValue, POSITION startAfter = NULL) const;
// defaults to starting at the HEAD, return NULL if not found
POSITION FindIndex(INT_PTR nIndex) const;
// get the 'nIndex'th element (may return NULL)// Implementation
protected:
CNode* m_pNodeHead;
CNode* m_pNodeTail;
INT_PTR m_nCount;
CNode* m_pNodeFree;
struct CPlex* m_pBlocks;
INT_PTR m_nBlockSize; CNode* NewNode(CNode*, CNode*);
void FreeNode(CNode*);public:
~CList();
void Serialize(CArchive&);
#ifdef _DEBUG
void Dump(CDumpContext&) const;
void AssertValid() const;
#endif
};
重新映射到内存后,应该不会把它填充进去。指针变了。填进去也没意思。
写个序列化,和反序列化的函数。自己处理比较好,而且升空间。=================================================================================== 你没有看仔细这个方案吗?