我在我的MFC应用程序中使用std :: string,我想将它存储在doc的Serialize()函数中.我不想将它们存储为CString,因为它在那里写了自己的东西,我的目标是创建一个我知道格式的文件,并且可以被其他应用程序读取而不需要CString.所以我想将我的std :: strings存储为4个字节(整数)字符串长度,然后是包含该字符串的大小的缓冲区.
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;
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码不是很好,我必须分配一个临时bfr来读取字符串.首先,我可以直接将字符串读入std :: string而不使用临时缓冲区吗?其次我可以重载<<缓冲区为std :: string/CArchive所以我可以简单地使用ar << theString?总的来说有一种更好的方法来使用CArchive对象读/写std :: string吗?
如果您使用的库仅适用于 c 样式字符串,则无法安全地直接写入 std::string。该问题已在 C++0x 中修复。所以像
// NOT PORTABLE, don't do this
theString.resize(size);
ar.Read( const_cast<char *>(theString.c_str(), size);
Run Code Online (Sandbox Code Playgroud)
可能会起作用,但它可能会在以后产生一些微妙的、难以跟踪的错误。当然,您的问题意味着您已经分析了代码并发现创建缓冲区并复制数据两次实际上是代码中的瓶颈。如果还没有,那么您不必担心效率低下。