Tôi đang sử dụng std :: string trong ứng dụng MFC của mình và tôi muốn lưu trữ nó trong hàm Serialize() của doc. Tôi không muốn lưu trữ chúng như là CString bởi vì nó viết các công cụ riêng của nó trong đó và mục tiêu của tôi là tạo một tệp mà tôi biết định dạng và có thể được đọc bởi ứng dụng khác mà không cần CString. Vì vậy, tôi muốn lưu trữ của tôi std :: strings như 4 byte (int) chuỗi chiều dài theo sau là bộ đệm của kích thước có chứa chuỗi.Tôi có thể quá tải toán tử CArchive << để làm việc với std :: string không?
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;
}
}
Mã trên không tuyệt vời và tôi phải phân bổ một temp bfr để đọc chuỗi. Trước tiên tôi có thể đọc chuỗi trực tiếp vào std :: string mà không có bộ đệm tạm thời? Thứ hai tôi có thể quá tải bộ đệm < < cho std :: string/CArchive vì vậy tôi chỉ có thể sử dụng ar < < theString? Nói chung là có một cách tốt hơn để đọc/ghi std :: string bằng cách sử dụng đối tượng CArchive?
Tôi đã thử điều này nhưng c_str() trả về 'const char *' và đó là một vấn đề. Tôi có lẽ có thể typecast nó chỉ đơn giản là 'char *' nhưng điều đó sẽ phần nào vi phạm các chức năng c_str(). – zar
Do đó, nhận xét "không làm điều này". Bạn có thể sử dụng 'std :: vector' hoặc vì bạn đang sử dụng đất MFC 'CString' –
AJG85