如何在C ++中使用位集库查找字符串变量的二进制文件以及如何将二进制文件转换为字符串? 我还有另一个问题,我们说字符串变量消耗8个字节,但是我发现任何长度的字符串变量仅消耗3个字节,而5个字节变为null或0,为什么呢? ???
即
string a="a";
string a="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
两者都只消耗3个字节.......为什么?
答案 0 :(得分:2)
std::string
是固定大小的结构,但是它包含通常存储在堆中的可变长度数据。由于动态分配是针对具体实施的,因此没有任何有意义的描述。
如果您使用sizeof(..)
进行测量,则会得到错误的答案。那只考虑了固定的存根。
对于它的价值,这是通过最小测试获得的:
#include <string>
#include <iostream>
int main() {
std::string short_str = "";
std::cout << "short_str.length()=" << short_str.length() << " sizeof(short_str)=" << sizeof(short_str) << std::endl;
std::string long_str = "";
for (int i = 0; i < 65535; ++i) {
long_str += "x";
}
std::cout << "long_str.length()=" << long_str.length() << " sizeof(long_str)=" << sizeof(long_str) << std::endl;
return 0;
}
这给出了输出:
short_str.length()=0 sizeof(short_str)=24
long_str.length()=65535 sizeof(long_str)=24
我不知道你从哪里得到3。您需要在代码中显示该值的来源以得到解释。
如果要从文件中读取和写入std::string
对象,则不能将它们作为二进制数据转储,则必须导出其字符串内容。
也就是说,您可以这样做:
file << str; // ✅
您不能这样做:
fwrite(&str, sizeof(str), 1, f); //
这只会转储原始字符串结构,并带有指向内存的指针,当您稍后在另一个过程中读回文件时,该指针将不存在。