C++:使用 std::string (&str[0]) 作为缓冲区安全读取文件?

C++: Safe reading from file with std::string (&str[0]) as a buffer?

我有一个正在读取的二进制文件。在文件中的某一点,有一个已知数量的字节组成一个简单的 ASCII 字符串(可能带有换行符)。现在我有:

void doSomething(istream &in) {
    vector<char> buf(length + 1, '[=11=]');
    in.read(&buf[0], length);
    string str(&buf[0]);
}

但我意识到这样做可能会更快

void doSomething(istream &in) {
    string str(length + 1, '[=12=]'); // +1 needed?
    in.read(&str[0], length);
}

我试着查看标准以查看字符串分配是否始终按顺序分配,或者这样做是否安全。安全的意思,不会意外读入(写入)内存而不是字符串的一部分。有人知道吗?

std::string 分配总是顺序的,至少从 C++11 开始是这样。我相信在此之前它并没有明确定义,但是没有实现使用非顺序存储。

您不需要为 std::string 中的空终止符显式添加 space。