我想将固定长度的数据从 std::istream 复制到字符串:
std::istream & operator >> ( std::istream & is, LogMsg & msg )
{
// read in 4 bytes - a uint32_t that describes the number of bytes in message:
// next, read the message bytes into the LogMsg
typedef std::istream_iterator<unsigned char> Iter;
Iter i (is);
uint32_t nSize = 0;
std::string & sMsg = msg.MsgRef();
is >> nSize;
sMsg.reserve(nSize);
std::copy(
i.begin(), i.begin() + nSize,
std::back_inserter(sMsg)
);
return is;
}
我无法使用此解决方案,因为迭代器上的 std::istream_iterator::begin() 函数仅是 c++11 (我仅限于 -std=gnu++0x 和 gcc 4.4.7
那么,如何将固定长度的数据从输入流复制到字符串中呢?
我最初查看了 std::istream::read,它似乎适合 - 它具有以下语法
is.read (buffer,length);
但我认为您无法读取字符串的内部缓冲区,并且我想避免复制到临时缓冲区。我可以以某种方式使用streambuf吗?
显而易见的解决方案是std::copy_n
:
std::copy_n( std::istreambuf_iterator<char>( is ), size, std::back_inserter( msg ) );
只有当你可以确定角色在那里时这才有效,
然而。如果您在尝试读取文件时遇到文件结尾
字符,会发生未定义的行为。这意味着虽然它是
这是一个显而易见的解决方案,但它可能不是一个好的解决方案。
然而,在 C++11 中,官方以及早期的实现中,
实践中,可以读入内部缓冲区。你必须确保
字符串有足够的空间:
msg.resize( size );
is.read( &msg[0], msg.size() );
(由于某种原因,没有非常量版本std::string::data()
,尽管保证了基本连续性
C++11。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)