std :: string等效于具有空字符的数据?

时间:2009-10-07 21:32:19

标签: c++ visual-c++ string file-io

我想阅读一个二进制文件并使用类似std::string的内容来自动调整缓冲区的大小等等。

我正在使用Visual C ++。我有什么选择?

5 个答案:

答案 0 :(得分:10)

std::string类已经处理了嵌入了NUL字符的数据。你遇到什么问题?

请注意,使用.c_str()方法时,任何嵌入的NUL字符都将终止返回的C样式字符串。

答案 1 :(得分:8)

std::string应该是安全的...您只需要小心使用.c_str()方法。使用.data()

答案 2 :(得分:5)

您可以随时使用std::vector<unsigned char> v(或您期望的任何类型的输入),然后只需&v[0]v.size()来获取大小的缓冲区。

答案 3 :(得分:2)

是的,您可以在std::string中嵌入空值。

示例:

std::string s;
s.push_back('\0');
s.push_back('a');
assert(s.length() == 2);

注意:std::string的{​​{1}}成员将始终在返回的char缓冲区中附加一个空字符;但是,c_str()的{​​{1}}成员可能会也可能不会将空字符附加到返回的char缓冲区。

小心操作符+ =

要注意的一件事是不要在RHS上使用std::stringdata()。它只会在空字符之前加起来。

例如:

operator+=

正确的方法:

char*

存储更常见的二进制数据以使用std :: vector

通常,使用std::string s = "hello"; s += "\0world"; assert(s.length() == 5); 存储任意二进制数据更为常见。

std::string s = "hello";
s += std::string("\0world", 6);
assert(s.length() == 11);

这可能更常见,因为std::vector的{​​{1}}和std::vector<char> buf; buf.resize(1024); char *p = &buf.front(); 成员返回const指针,因此内存不可修改。使用&amp; buf.front(),您可以直接修改缓冲区的内容。

答案 4 :(得分:0)

std :: string允许使用NUL字符,因此您可以继续使用它。

使用c_str()或data()没有问题。是的,嵌入式NUL将存在于您的数据中,但是如果您不使用它们来终止字符串(您需要调用length()来查找字符串中有多少字节)那么一切都会好的。