C++ 将数据保存到二进制文件,哪种方法正确?

C++ 将数据保存到二进制文件,哪种方法正确?,c++,file,C++,File,我想将一个字符串保存到一个二进制文件中,这是正确的吗 std::ofstream outfile(filename, std::ios_base::binary); string str="some text"; for (const char &i : str) { outfile.write((const char *) &i, sizeof(char)); } 或: 注意:我不想在字符串末尾保存空终止符。IM

我想将一个字符串保存到一个二进制文件中,这是正确的吗

std::ofstream outfile(filename, std::ios_base::binary);


string str="some text";
for (const char &i : str) {
            outfile.write((const char *) &i, sizeof(char));
        }
或:


注意:我不想在字符串末尾保存空终止符。

IMHO,正确的方法是先写字符串的长度,然后写字符串的内容:

const std::string example_text = "Redwood trees are very tall.";
const unsigned int length = example_text.length();
outfile.write((char *) &length, sizeof(length));
outfile.write(example_text.data(), length);
这允许使用块读取:

unsigned int length;
outfile.read((char *) &length, sizeof(length));
std::string text;
text.reserve(length);
outfile.read(text.data(), length);

请让我知道是否需要更多的细节。两个看起来都是正确的,你面临什么问题?@ÖTiib第二个不会也保存空终止符吗?第二个在我看来似乎很狡猾。为什么不使用
str.data()
str.c_str()
?您是否在某处写入长度以便能够读回?如果字符串长度大于
sizeof(std::string)
,则第二个将不会写入字符串的字符,并且具有未定义的行为。你将无法读回它。Do
outfile.write(str.data(),str.length())
unsigned int length;
outfile.read((char *) &length, sizeof(length));
std::string text;
text.reserve(length);
outfile.read(text.data(), length);