将字符串写入二进制文件C++

Ken*_*2pd 6 c++ string malloc file

我在将字符串写入二进制文件时遇到问题.这是我的代码:

ofstream outfile("myfile.txt", ofstream::binary);
std::string text = "Text";
outfile.write((char*) &text, sizeof (string));
outfile.close();
Run Code Online (Sandbox Code Playgroud)

然后,我尝试阅读它,

char* buffer = (char*) malloc(sizeof(string));
ifstream infile("myfile.txt", ifstream::binary);    
infile.read(buffer, sizeof (prueba));
std::string* elem = (string*) buffer;
cout << *elem;
infile.close();
Run Code Online (Sandbox Code Playgroud)

我不能让它工作.对不起,我只是绝望了.谢谢!

小智 10

要将 std::string 写入二进制文件,您需要先保存字符串长度:

std::string str("whatever");
size_t size=str.size();
outfile.write(&size,sizeof(size));
outfile.write(&str[0],size);
Run Code Online (Sandbox Code Playgroud)

要读取它,请反转该过程,首先调整字符串的大小,以便您有足够的空间:

std::string str;
size_t size;
infile.read(&size, sizeof(size));
str.resize(size);
infile.read(&str[0], size);
Run Code Online (Sandbox Code Playgroud)

因为字符串的大小是可变的,除非您将该大小放入文件中,否则您将无法正确检索它。您可以依赖 '\0' 标记,该标记保证位于 c 字符串的末尾或等效的 string::c_str() 调用,但这不是一个好主意,因为

  1. 你必须逐个字符地读入字符串检查空值
  2. std::string 可以合法地包含一个空字节(尽管它确实不应该,因为对 c_str() 的调用会令人困惑)。

  • 这对我有用,只需进行一次更改。在写代码中,我改了 outfile.write(&amp;str[0],size); 到 outfile.write(str.c_str(),size); (2认同)

And*_*rsK 9

这条线

outfile.write((char*) &text, sizeof (string));
Run Code Online (Sandbox Code Playgroud)

是不正确的

sizeof(string) 不返回字符串的长度,它返回字符串类型的sizeof(以字节为单位).

也不要将文本转换为char*使用C转换,您可以通过使用适当的成员函数来获取char*text.c_str()

你可以简单地写

outfile << text;
Run Code Online (Sandbox Code Playgroud)

代替.


小智 1

也许也应该用来c_str()获取 char 指针,而不是直接疯狂的强制转换。