可变长数据结构,也是比较实用的,尤其在内存需要节俭的时候。
比如下面的数据结构,由于string长度是不确定的
typedef struct SMagicDat
{
int id;
std::string str1;
std::string str2;
}SMagicDat;
像这样的变长数据写入文件后,回读就比较麻烦。
本次操作实例一枚,仅作参考
int main()
{
fstream fout("bb.txt", ios::binary|ios::out);
if (fout == 0)
return -1;
int iCnt = 0;
fout.write((char*)&iCnt, sizeof(iCnt));
fout.close();
typedef struct SVarlength
{
int id;
int id2;
int len;
}SVarlength;
typedef struct SMagicDat
{
int id;
std::string str1;
std::string str2;
}SMagicDat;
fstream fout2("bb.txt", ios::binary|ios::in|ios::out);
if (fout2 == 0)
return -1;
int iCnt2 = 0;
fout2.read((char*)&iCnt2, sizeof(iCnt2));
printf("icnt2=%d.\n", iCnt2);
SDat src_dat[10];
char szTemp[100] = {0};
string strVar;
SVarlength var;
char chSTX = 0x02;
char chETX = 0x03;
fout2.seekp(sizeof(iCnt2), ios::beg);
for(int ii=0; ii<10; ii++)
{
src_dat[ii].id = 100+ii;
sprintf(szTemp, "id=%d,str1=%d.", src_dat[ii].id, src_dat[ii].id);
src_dat[ii].str1 = szTemp;
sprintf(szTemp, "id=%d,str2=%d.%d=str2", src_dat[ii].id, src_dat[ii].id, src_dat[ii].id);
src_dat[ii].str2 = szTemp;
strVar = chSTX + src_dat[ii].str1 + chETX \
+ chSTX + src_dat[ii].str2 + chETX;
var.id = src_dat[ii].id;
var.id2 = src_dat[ii].id + 100;
var.len = strVar.length();
fout2.write((char*)&var, sizeof(var));
fout2.write(strVar.c_str(), strVar.length());
}
//
iCnt2 += 10;
fout2.seekp(0, ios::beg);
fout2.write((char*)&iCnt2, sizeof(iCnt2));
fout2.close();
fstream fin("bb.txt", ios::binary|ios::in);
if (fin == 0)
return -1;
int iCnt3 = 0;
fin.read((char*)&iCnt3, sizeof(iCnt3));
printf("icnt3=%d.\n", iCnt3);
SVarlength var2;
char* pBuff = NULL;
int iBuff = 0;
for(int ii=0; ii<iCnt3; ii++)
{
fin.read((char*)&var2, sizeof(var2));
printf("id=%d, id2=%d, len=%d: ", var2.id, var2.id2, var2.len);
if (var2.len > iBuff)
{
if (iBuff > 0)
{
delete[] pBuff;
}
pBuff = new char[var2.len + 2];
if (pBuff)
{
iBuff = var2.len + 2;
}
}
fin.read(pBuff, var2.len);
printf("%s.\n", pBuff);
}
if (iBuff > 0)
{
iBuff = 0;
delete[] pBuff;
}
return 0;