我在将字符串写入二进制文件时遇到问题。这是我的代码:
ofstream outfile("myfile.txt", ofstream::binary);
std::string text = "Text";
outfile.write((char*) &text, sizeof (string));
outfile.close();
然后,我试着读它,
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();
我只是无法让它工作。对不起,我只是绝望。谢谢!
要将 std::string 写入二进制文件,您需要先保存字符串长度:
std::string str("whatever");
size_t size=str.size();
outfile.write(&size,sizeof(size));
outfile.write(&str[0],size);
要读入它,请反转该过程,首先调整字符串的大小,以便您有足够的空间:
std::string str;
size_t size;
infile.read(&size, sizeof(size));
str.resize(size);
infile.read(&str[0], size);
由于字符串具有可变大小,除非您将该大小放入文件中,否则您将无法正确检索它。您可以依赖保证位于 c 字符串末尾的"\0"标记或等效的字符串::c_str() 调用,但这不是一个好主意,因为
- 您必须逐个字符读取字符串,检查空 值
- std::string 可以合法地包含一个空字节(尽管它真的不应该,因为对 c_str() 的调用会令人困惑)。
行
outfile.write((char*) &text, sizeof (string));
不正确
sizeof(string)
不返回字符串的长度,而是返回字符串类型的大小(以字节为单位)。
也不要使用 C 强制转换将文本转换为char*
,您可以使用适当的成员函数来获取 char* text.c_str()
你可以简单地写
outfile << text;
相反。
- 为什么要使用指向
std::string
类的指针? - 您不应该将
sizeof
与std::string
一起使用,因为它返回std::string
对象的大小,而不是里面字符串的实际大小。
您应该尝试:
string text = "Text";
outfile.write(text.c_str(), text.size());
或
outfile << text;
也应该使用c_str()
来获取字符指针,而不是直接疯狂的投射。
你的代码是错误的,你用来写入和读取文件的方式错误和文件扩展名错误,您正在尝试读取文本文件.txt
正确的代码
写入文件
std::string text = "Text";
ofstream outfile("myfile.dat", ofstream::binary | ios::out);
outfile.write(&text,sizeof (string));//can take type
outfile.write(&text,sizeof (text));//can take variable name
outfile.close();
读取文件
char* buffer = (char*) malloc(sizeof(string));
ifstream infile("myfile.dat", ifstream::binary | ios::in);
infile.read(buffer, sizeof (prueba));
std::string* elem = (string*) buffer;
cout << *elem;
infile.close();
试试这个它会起作用
我遇到了同样的问题。我在这里找到了完美的答案:以二进制格式写入文件
关键问题:在写出字符串时使用 string::length 获取字符串的长度,并在读取字符串之前使用 resize()。对于读取和写入,请使用 mystring.c_str() 代替字符串本身。
试试这个代码片段。
/* writing string into a binary file */
fstream ifs;
ifs.open ("c:/filename.exe", fstream::binary | fstream::in | fstream::out);
if (ifs.is_open())
{
ifs.write("string to binary", strlen("string to binary"));
ifs.close();
}
这是一个很好的例子。