在使用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
类型,并输出字符串内容。