之前我有遇到过一个练习题,要我将string类对象存入二进制文件中,而众所周知,二进制文件是不可以存储指针的,因为当你读取二进制文件里的指针的时候,这个指针原来指向的内存地址已经被回收了,这是无意义了。
然后书上介绍了一种方法,先将string对象里面存储的字符串数目存储在一个基本类型中,书上用的是size_t,然后用循环将二进制里的字符提取出来并插入string对象中,而存入则是使用data() 因为这个成员函数返回的是不包含'\0'的字符串。
c_str() 返回包含为'\0'的字符串
data() 返回不包含'\0'的字符串
而读取文件的时候如果读取到’\0’,会返回eof(),所以使用data()。
这里仅为个人想法,给需要的人以参考,如有不对或更好的办法,请告知我
这里是我自己写的代码,有不对的地方请纠正我。
#include<iostream>
#include<string>
#include<fstream>
#include<cstdlib>
int main()
{
using namespace std;
string input;
cout << "Enter a string: ";
getline(cin, input);
ofstream fout("test.dat", ios_base::out | ios_base::binary);
if (!fout.is_open())
{
cerr << "Can't open test.dat.\n";
exit(EXIT_FAILURE);
}
size_t len = input.length();
fout.write((char*)&len, sizeof size_t); //将string对象的长度写入文件中
fout.write(input.data(), sizeof input); //将string对象的内容写入文件中
fout.close();
//读取文件
string output;
char ch; //因为不能直接整段读取 所以要一个字符一个字符读取 然后再存入string中
ifstream fin("test.dat", ios_base::in | ios_base::binary);
if (!fin.is_open())
{
cerr << "Can't open test.dat.\n";
exit(EXIT_FAILURE);
}
fin.read((char*)&len, sizeof size_t); //将string对象的长度读取出来并存入len中
for (int i = 0; i < len; i++)
{
fin.read((char*)&ch, sizeof ch); //先读入ch中
output += ch; //用string对象的方法将ch插入到string对象中
}
fin.close();
//输出测试一下存入的数据和读取的数据是否一致
cout << "input: " << input << endl;
cout << "output: " << output << endl;
return 0;
}