[C/C++笔记] fstream以二进制模式读写字符串类型string

在使用ifstream进行二进制文件操作时,需注意字符编码、字符串长度和特殊字符。写入时,写入字符串长度和内容;读取时,先读取长度再读取内容,处理可能的特殊字符如NULL。示例代码展示了如何保存和读取字符串。
摘要由CSDN通过智能技术生成

在使用ifstream以二进制模式读写文件时,保存的数据是字符串类型的话,需要注意以下问题:

  • 字符编码:当读写字符串时,需要注意字符的编码格式。例如,在 Windows 系统中,通常使用 GBK 编码保存文本文件,而在 Linux 或 macOS 系统中,通常使用 UTF-8 编码保存文本文件。因此,在读写跨平台的字符串时,需要确定其编码格式,并相应地处理。

  • 字符串长度:在将字符串写入二进制文件时,需要确保将整个字符串的内容都写入文件,而不是仅写入字符串指针所指向的地址。可以通过使用string::size()函数获取字符串的实际长度,并通过ofstream类的write()函数将其写入文件中。在读取字符串时,也需要先读取字符串的长度,并根据长度读取字符串的内容。

  • 特殊字符:如果字符串中包含特殊字符(例如 NULL 终止符\0),则可能会导致数据解析错误。在将字符串写入二进制文件时,可以使用string::c_str()函数获取字符串的字符数组指针,并通过ofstream类的write()函数将其中的字符写入文件中。在读取字符串时,也可以先读取字符串的长度,并创建一个字符数组来存储字符串的内容。

下面是一个将字符串保存到二进制文件中并读取出来的例子:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main() {
    string filename = "example.txt";

    // 将字符串保存到二进制文件中
    string str = "Hello, world!";
    ofstream outfile(filename, ios::binary);
    if (!outfile.is_open()) {
        cout << "Failed to open file " << filename << endl;
        return 1;
    }
    int len = str.size();
    outfile.write(reinterpret_cast<char*>(&len), sizeof(int));
    outfile.write(str.c_str(), len);
    outfile.close();

    // 从二进制文件中读取字符串
    ifstream infile(filename, ios::binary);
    if (!infile.is_open()) {
        cout << "Failed to open file " << filename << endl;
        return 1;
    }
    int read_len;
    infile.read(reinterpret_cast<char*>(&read_len), sizeof(int));
    char* buffer = new char[read_len + 1];
    infile.read(buffer, read_len);
    buffer[read_len] = '\0';
    string read_str(buffer);
    delete[] buffer;
    infile.close();

    cout << read_str << endl;

    return 0;
}

在上面的代码中,我们先将字符串"Hello, world!"写入二进制文件中。在写入文件时,首先使用string::size()函数获取字符串的长度,并将其写入文件中。然后,使用string::c_str()函数获取字符串的字符数组指针,并将其中的字符写入文件中。

在读取文件时,首先读取整型值(即字符串长度),并根据该长度创建一个字符数组。然后,使用ifstream类的read()函数读取字符串的内容,并添加 NULL 终止符以表示字符串的结束。最后,将字符数组转换为string类型,并输出字符串内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值