关于将string类对象存入二进制文件

之前我有遇到过一个练习题,要我将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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值