Sto usando std :: string nella mia applicazione MFC e voglio conservarlo in funzione di Doc Serialize(). Non voglio memorizzarli come CString perché scrive le proprie cose lì dentro e il mio obiettivo è creare un file che conosca il formato e possa essere letto da un'altra applicazione senza aver bisogno di CString. Quindi vorrei memorizzare il mio std :: stringhe come 4 byte (int) lunghezza della stringa seguita da buffer di quella dimensione contenente la stringa.Posso sovraccaricare l'operatore CArchive << per lavorare con std :: string?
void CMyDoc::Serialize(CArchive& ar)
{
std::string theString;
if (ar.IsStoring())
{
// TODO: add storing code here
int size = theString.size();
ar << size;
ar.Write(theString.c_str(), size);
}
else
{
// TODO: add loading code here
int size = 0;
ar >> size;
char * bfr = new char[ size ];
ar.Read(bfr, size);
theString = bfr;
delete [] bfr;
}
}
Il codice di cui sopra non è eccezionale e devo assegnare un bfr temporaneo per leggere la stringa. Per prima cosa posso leggere la stringa direttamente in std :: string senza il buffer temporaneo? Secondariamente posso sovraccaricare il buffer < < per std :: string/CArchive quindi può semplicemente utilizzare ar < < TheString? Nel complesso c'è un modo migliore per leggere/scrivere std :: string usando l'oggetto CArchive?
Ho provato questo ma c_str() restituisce un 'const char *' e questo è un problema. Probabilmente avrei potuto convertirlo semplicemente in "char *", ma ciò avrebbe in qualche modo violato la funzione c_str(). – zar
Quindi il commento "non fare questo". Puoi usare un 'std :: vector' o dato che sei in terra MFC usa 'CString' –
AJG85