我可以超载 CArchive <<运算符与 std::string 一起使用吗?
我在 MFC 应用程序中使用 std::string ,我想将其存储在 doc 的 Serialize() 函数中。我不想将它们存储为 CString,因为它在其中写入自己的内容,我的目标是创建一个我知道其格式并且可以由其他应用程序读取的文件,而无需 CString。所以我想将我的 std::strings 存储为 4 个字节(int)字符串长度,后跟包含该字符串的该大小的缓冲区。
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;
}
}
上面的代码不太好,我必须分配一个临时 bfr 来读取字符串。首先,我可以直接将字符串读入 std::string 而不使用临时缓冲区吗?其次,我可以超载<<吗? std::string / CArchive 的缓冲区,因此我可以简单地使用 ar <<字符串?总的来说,有没有更好的方法使用 CArchive 对象读取/写入 std::string ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
您可以从 stl 字符串构建一个就地 CString 并将其序列化。例如:
您可以将其放入全局操作员重载中,这样您就可以
从任何地方进行操作,例如:
You could build an inplace CString from your stl string and serialize that. Something like:
You could put this in a global operater overload so it can you can just
from anywhere eg:
尝试:
从技术上讲,
&theString[0]
不能保证指向连续的字符缓冲区,但 C++ 委员会进行了一项调查,发现所有现有的实现都是这样工作的。Try:
Technically
&theString[0]
is not guaranteed to point to a contiguous character buffer, but the C++ committee did a survey and found that all existing implementations work this way.由于各种原因,将数据写为 CString 可能会更好,但是如果您必须将 String (m_sString) 转换为 ASCII 字符串,也许这样的东西适合您......
Its probably better to write the data as a CString for various reasons, but if you have to convert your String (m_sString) into an ASCII character string, maybe something like this will work for you...
只是为
std::string
和std::wstring
添加一个功能齐全且正确的示例(希望如此):写作...
阅读...
Just to add a fully functional and correct example (hopefully) for both
std::string
andstd::wstring
:Writing ...
Reading ...
如果您使用的库仅适用于 c 样式字符串,则无法安全 直接写入 std::string。该问题已在 C++0x 中修复。
所以像这样的东西
可能会起作用,但它可能会在以后产生一些微妙的、难以跟踪的错误。
当然,您的问题意味着您已经分析了代码并发现创建缓冲区并复制数据两次实际上是代码中的瓶颈。如果还没有,那么您不必担心效率低下。
If you are working with a library that only works with c-style strings, there is no way to safely write directly to the std::string. That issue is fixed in C++0x.
So something like
Would probably work, but it could create some subtle, hard-to-track bugs later on.
Of course your question implies that you have profiled your code and figured out that creating the buffer and copying the data twice is actually a bottleneck in your code. If you haven't, then you shouldn't be fretting about inefficiencies yet.
我想您可能会违反 STL 准则并继承
std::string
并添加您自己的缓冲区 getter/setter。然后重写 std::string 的复制构造函数并转移缓冲区的所有权。I suppose you could violate STL guidelines and inherit
std::string
and add your own buffer getter/setter. Then override the copy constructor for std::string and transfer ownership of the buffer.