内容来自回答一个论坛上网友的提问。。 顺便写到博客里面。 问题为“ 求用纯C语言序列化复杂结构体的方法”
于是 给他写了这样一个链表的序列化代码
typedef struct _MyStruct
{
int nA;
char cB;
struct _MyStruct* pNext;
}MYSTRUCT, *PMYSTRUCT;
一开始我的思路是 用 unsigned char uszBuf[8] = { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};这样一个很冷门的64位数值 作为分隔线,用来隔开每一个链表域。
所以衍生出这样的一段代码:
#include <stdlib.h>
#define OUT
#define IN
typedef struct _MyStruct
{
int nA;
char cB;
struct _MyStruct* pNext;
}MYSTRUCT, *PMYSTRUCT;
// 序列化写入文件,-1代表失败
int serialInToFile(IN PMYSTRUCT pList, IN const char* pFileName)
{
int nReturn = -1;
unsigned char uszBuf[8] = {
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
FILE* pFile = fopen(pFileName, "wb+");
if (!pFile)
return nReturn;
while (pList!= NULL)
{
fwrite(pList, 1, 5, pFile); // 5个字节 int + char
pList = pList->pNext;
if (pList)
fwrite(uszBuf, 1, 8, pFile);
}
fclose(pFile);
nReturn = 1;
return nReturn;
}
// 序列化写入文件,-1代表失败
int serialOutFromeFile(OUT PMYSTRUCT* ppList, IN const char* pFileName)
{
int nReturn = -1;
FILE* pFile = fopen(pFileName, "rb");
PMYSTRUCT pCurNode = (PMYSTRUCT)malloc(sizeof(MYSTRUCT));
unsigned char uszBuf[8] = {
0};
int i = 0;
int* pA = NULL;
if (!pFile)
return nReturn;
*ppList = pCurNode;
while(!feof(pFile))
{
pCurNode ->pNext = NULL;
fread(uszBuf, 1, 4, pFile);
pA = (int*)uszBuf;
pCurNode->nA = *pA;
fscanf(pFile, "%c", &(pCurNode->cB));
fread(uszBuf, 1, 8, pFile);
for (i = 0; i < 8; i ++)
{
if (uszBuf[i] != 0xff)
break;
}
if (i == 8)
{
pCurNode->pNext = (PMYSTRUCT)malloc(sizeof(MYSTRUCT));
pCurNode = pCurNode->pNext;
}
}
fclose(pFile);
nReturn = 1;
return nReturn;
}
void InitStruct(PMYSTRUCT pSTest)
{
pSTest