MFC uygulamasında std :: string kullanıyorum ve bunu doc's Serialize() işlevinde saklamak istiyorum. Bunları CString olarak saklamak istemiyorum çünkü kendi yazılarını orada yazıyor ve amacım CString'e gerek duymadan diğer uygulamaların formatını bildiğim ve okuyabileceğim bir dosya oluşturmak. Bu yüzden std :: string'leri 4 bayt (int) string uzunluğu olarak saklamak ve ardından dizeyi içeren bu boyuttaki arabelleği saklamak istiyorum.Std :: string ile çalışmak için CArchive << operatörünü aşırı yükleyebilir miyim?
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;
}
}
Yukarıdaki kod büyük değildir ve dizeyi okumak için bir geçici bfr ayırmak zorundayım. İlk olarak, temp tamponu olmaksızın dizeyi doğrudan std :: string dosyasına okuyabilir miyim? İkinci olarak, < < < arabelleğini std :: string/CArchive için aşırı yükleyebilirim, bu yüzden sadece < < theString? Genel olarak, CArchive nesnesini kullanarak std :: string okumak/yazmak için daha iyi bir yol var mı?
Bunu denedim ama c_str() bir 'const char *' döndürüyor ve bu bir sorun. Muhtemelen 'char *' olarak yazabilirim ama bu c_str() işlevini bir şekilde ihlal eder. – zar
Böylece "bunu yapma" yorumu. 'Std :: vector' veya MFC arazi kullanımı 'CString' kullandığınız için kullanabilirsiniz. –
AJG85