【发布时间】:2010-12-21 10:33:55
【问题描述】:
有没有办法直接将已知数量的字节读取到 std::string 中,而无需创建临时缓冲区?
例如,目前我可以通过
boost::uint16_t len;
is.read((char*)&len, 2);
char *tmpStr = new char[len];
is.read(tmpStr, len);
std::string str(tmpStr, len);
delete[] tmpStr;
【问题讨论】:
-
您是否考虑过使用
vector<char>而不是string?如果您的数据比“类字符串”更“原始”,它可能更适合您,并且直接访问的混淆更少。 (向量需要连续存储,所以使用&v[0]。) -
大部分是字符串数据,只是嵌入在大型二进制文件中。此外,我只想更改加载例程,而不是在加载后使用数据的 1000 行代码,从 std::string 进行更改需要。
-
然后我会检查你的具体字符串实现,然后使用 GMan 的答案,确保你也检查
is.read之后的流。 -
我看到这是旧的,但我只需要对未来的读者发表评论:请不要相信流中的字节的长度值,因为它们可能被损坏或被恶意用户操纵。在这种情况下,64KB 可能并不算太糟糕,但你永远不知道。我认为一些 GIF 和 JPG 代码执行错误是由这样的代码造成的。
-
当然。为字符串创建一个具有 4 字节长度字段的流。使用
int。从流中读取 4 个字节,加 1 并为字符串加上空终止符分配那么多。如果邪恶流使用0xFFFF作为长度怎么办?读作-1。你加 1 得到 0,malloc 0,然后事情就会从那里走下坡路,具体取决于细节。