1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
{
string FilePath = StrParam();
ofstream Save;
Save.open(FilePath.c_str(), ios_base::out|ios_base::binary|ios_base::trunc/*|ios_base::app*/);
if(!Save.is_open())
{
//rdPtr->ErrorString = "Could open file \"";
//rdPtr->ErrorString += FilePath;
//rdPtr->ErrorString += "\" for save output.";
//rdPtr->rRd->GenerateEvent(/*ERROR*/);
Save.close();
return;
}
if(Save.fail())
{
//rdPtr->ErrorString = "Could not save to file \"";
//rdPtr->ErrorString += FilePath;
//rdPtr->ErrorString += "\"";
//rdPtr->rRd->GenerateEvent(/*ERROR*/);
Save.close();
return;
}
/* ******* Helpful Stuff ******* */
#define Write(Data,Size) Save.write((char *)&(Data),(Size)) //Write some Data of any kind
#define Term() Save.put('\0') //Terminate with '\0'
/* ******* Save Code!! ******* */
const string Identifier = "Timeline";
const unsigned char Version = 0;
/**/ Write(Identifier.c_str(), Identifier.length()); //8 character ID
Write(Version, sizeof(unsigned char)); //Version Number
/**/ Write(rdPtr->Timeline->size(), sizeof(unsigned long)); //Number of Positions
for(map<unsigned long, vector<Event> >::iterator EvtIt = rdPtr->Timeline->begin(); EvtIt != rdPtr->Timeline->end(); ++EvtIt) //For Each Position
{
Write(EvtIt->first, sizeof(unsigned long)); //Current Position
/**/ Write(EvtIt->second.size(), sizeof(unsigned long)); //Number of Events
for(unsigned long i = 0; i < EvtIt->second.size(); ++i) //For Each Event
{
/**/ Write(EvtIt->second[i].Name.c_str(), EvtIt->second[i].Name.size()); //Event Name
Term(); //End String
/**/ Write(EvtIt->second[i].Values.size(), sizeof(unsigned long)); //Number of Values
for(map<string, signed long>::iterator ValIt = EvtIt->second[i].Values.begin(); ValIt != EvtIt->second[i].Values.end(); ++ValIt) //For Each Value
{
/**/ Write(ValIt->first.c_str(), ValIt->first.size()); //Value Name (As String)
Term(); //End String
Write(ValIt->second, sizeof(signed long)); //Value of Value
}
/**/ Write(EvtIt->second[i].Strings.size(), sizeof(unsigned long)); //Number of Strings
for(map<string, string>::iterator StrIt = EvtIt->second[i].Strings.begin(); StrIt != EvtIt->second[i].Strings.end(); ++StrIt) //For Each String
{
/**/ Write(StrIt->first.c_str(), StrIt->first.size()); //String Name (As String)
Term(); //End String
/**/ Write(StrIt->second.c_str(), StrIt->second.size()); //Content of String
Term(); //End String
}
}
}
/* ******* All Done! ******* */
Save.close();
}
| |