二进制文件中 的数据不是 字符数据 , 而是以 二进制形式 存储的 字节数据 , 有特定的格式 , 如 : PNG 头文件 , 有特定的文件头 , 数据位 , 校验位 , 使用 文本编辑器 打开都是乱码 ;
二进制文件 是 将内存中 二进制数据 不加转换 直接存储到 文件 中 , 二进制文件又称为 内存数据映射文件 ;
对 二进制文件 的 读写访问操作 ,
ios::binary
打开方式 , 否则默认以字符方式打开 ;以二进制形式打开文件参数 :
使用 istream
类的 read 和 ostream
类的 write 函数 , 可以对二进制文件进行读写操作 , 函数原型如下 :
istream& read(char *buffer,int len);
ostream& write(const char * buffer,int len);
istream
是 C++ 标准库中用于处理输入流的类 , 它提供了许多方法来读取数据 ;
ifstream 继承 istream 类 ;
read()
函数是 istream
类的一个成员函数 , 用于从输入流中读取指定长度的数据并存储到指定的缓冲区中 , 函数原型如下 :
istream& read(char *buffer, int len);
这个函数有两个参数:
read() 函数 的 返回值是 一个 istream 对象的引用 , 可以用于链式调用 ;
read() 函数可以指定要读取的字节数 , 但实际读取的字节数需要调用 ifstream 的 gcount() 函数来获取 , 其函数原型如下 :
streamsize gcount();
ifstream 的 gcount() 函数 返回一个 streamsize 类型的值 , 表示上次 输入操作 读取的字节数 ;
gcount() 函数返回的是上一次输入操作读取的字节数 , 而不是当前输入位置的位置 ;
在下面的代码中 , 先在 资源文件 中创建二进制文件 1.bin ;
然后 以二进制形式打开 1.bin 二进制文件 ,
ifstream ifs("1.bin", ios::binary);
最后 , 调用 read() 函数 , 读取文件中的数据 ;
ifs.read(buffer, len);
代码示例 :
#include "iostream"
using namespace std;
#include "fstream"
int main() {
// 以二进制形式打开资源文件 1.bin
ifstream ifs("1.bin", ios::binary);
// 如果 ifs 对象值为 0 , 说明文件打开失败
if (!ifs) {
cerr << "文件打开失败" << endl;
return 1;
}
else {
cout << "文件打开" << endl;
}
// 存放数据的缓冲区
char buffer[1024];
int len = sizeof(buffer);
// 读取文件数据 到 buffer 数组
ifs.read(buffer, len);
// 检查实际读取的字节数
// 读取 1024 字节 , 如果文件不足 1024 字节
// 可调用 gcount 获取实际读取的字节数
if (ifs.gcount() < len) {
cerr << "读取完毕" << endl;
}
// 关闭文件
ifs.close();
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
};
执行结果 :
文件打开
读取完毕
Press any key to continue . . .
ostream 是 C++ 标准库中用于处理输出流的类 , 它提供的 write() 函数 用于将指定长度的数据写入输出流 ;
ofstream 继承 ostream 类 ;
ostream 类的 write() 函数的原型如下 :
ostream& write(const char * buffer,int len);
fail() 函数是 ostream 类中的一个成员函数 , 用于 验证输出是否出错 ;
ostream 类的 fail() 函数的原型如下 :
bool fail() const;
fail() 函数 返回一个布尔值 , 表示输出流是否处于失败状态 ;
如果输入流没有发生错误 , 返回 false ;
如果输出流发生错误 , 返回 true ; 例如 : 无法打开文件或写入数据失败 , 则 fail() 函数将返回 true ;
fail() 函数可以与其他 ostream 类的成员函数结合使用 ; 例如 : fail() 和 clear() 函数可以用于清除输出流的错误状态 ;
代码示例 :
#include "iostream"
using namespace std;
#include "fstream"
int main() {
// 以二进制形式打开资源文件 1.bin
ofstream ofs("1.bin", ios::binary);
// 如果 ofs 对象值为 0 , 说明文件打开失败
if (!ofs) {
cerr << "文件打开失败" << endl;
return 1;
}
else {
cout << "文件打开成功" << endl;
}
// 要写出的数据
char data[] = "Hello, world!";
int len = sizeof(data);
// 将数据写出到文件中
ofs.write(data, len);
// 验证是否写出完毕
if (!ofs.fail()) {
cerr << "写出完毕" << endl;
}
// 关闭文件
ofs.close();
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
};
执行结果 :
文件打开成功
写出完毕
Press any key to continue . . .
写出的文件内容 :