【C++】输入输出流 ⑪ ( 文件流 | 二进制形式打开文件 | 二进制文件读取 | read 函数 | gcount 函数 | 二进制文件写出 | write 函数 | fail 函数 )






一、二进制形式打开文件




1、二进制文件简介


二进制文件中 的数据不是 字符数据 , 而是以 二进制形式 存储的 字节数据 , 有特定的格式 , 如 : PNG 头文件 , 有特定的文件头 , 数据位 , 校验位 , 使用 文本编辑器 打开都是乱码 ;

二进制文件 是 将内存中 二进制数据 不加转换 直接存储到 文件 中 , 二进制文件又称为 内存数据映射文件 ;


对 二进制文件 的 读写访问操作 ,

  • 首先 , 打开 二进制文件 , 再打开时需要指定 ios::binary 打开方式 , 否则默认以字符方式打开 ;
  • 然后 , 进行 二进制文件 读写 访问操作 ;
  • 最后 , 关闭 二进制文件 ;

2、以二进制形式打开文件参数


以二进制形式打开文件参数 :

  • ios::binary : 以二进制方式打开文件 ; 默认是 ASCII 码方式打开 ;
  • ios::in | ios::binary : 以 二进制形式 打开输入文件 ;
  • ios::out | ios::binary : 以 二进制形式 打开输出文件 ;
  • ios::in l ios::out I ios::binary : 以 二进制形式 打开 输入 和 输出 文件 ;




二、二进制文件读取



使用 istream 类的 read 和 ostream 类的 write 函数 , 可以对二进制文件进行读写操作 , 函数原型如下 :

istream& read(char *buffer,int len);
ostream& write(const char * buffer,int len);

1、二进制文件读取 - read() 函数


istream 是 C++ 标准库中用于处理输入流的类 , 它提供了许多方法来读取数据 ;

ifstream 继承 istream 类 ;

read() 函数是 istream 类的一个成员函数 , 用于从输入流中读取指定长度的数据并存储到指定的缓冲区中 , 函数原型如下 :

istream& read(char *buffer, int len);

这个函数有两个参数:

  • buffer : 指向要存储读取数据的字符数组的指针 , 将该数据存储到文件中 ;
  • len : 要读取的字节数 ;

read() 函数 的 返回值是 一个 istream 对象的引用 , 可以用于链式调用 ;


2、获取实际读取的字节数 - gcount() 函数


read() 函数可以指定要读取的字节数 , 但实际读取的字节数需要调用 ifstream 的 gcount() 函数来获取 , 其函数原型如下 :

streamsize gcount();

ifstream 的 gcount() 函数 返回一个 streamsize 类型的值 , 表示上次 输入操作 读取的字节数 ;

gcount() 函数返回的是上一次输入操作读取的字节数 , 而不是当前输入位置的位置 ;

  • 如果上一次输入操作是读取一个字符 , 那么 gcount() 函数 返回的值将为 1 ;
  • 如果上一次输入操作是读取一个完整的行 , 那么 gcount() 函数 返回的值将为该行的字节数 ;

3、代码示例 - 文件读取


在下面的代码中 , 先在 资源文件 中创建二进制文件 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 . . .

在这里插入图片描述





三、二进制文件写出




1、二进制文件写出 - write() 函数


ostream 是 C++ 标准库中用于处理输出流的类 , 它提供的 write() 函数 用于将指定长度的数据写入输出流 ;

ofstream 继承 ostream 类 ;

ostream 类的 write() 函数的原型如下 :

ostream& write(const char * buffer,int len);
  • 参数分析 :
    • buffer:指向要写入输出流的字符数组的指针。
    • len:要写入的字节数。
  • 返回值分析 : write() 函数返回一个 ostream 对象的引用 , 可以用于链式调用 ;

2、验证输出是否出错 - fail() 函数


fail() 函数是 ostream 类中的一个成员函数 , 用于 验证输出是否出错 ;

ostream 类的 fail() 函数的原型如下 :

bool fail() const;

fail() 函数 返回一个布尔值 , 表示输出流是否处于失败状态 ;

如果输入流没有发生错误 , 返回 false ;

如果输出流发生错误 , 返回 true ; 例如 : 无法打开文件或写入数据失败 , 则 fail() 函数将返回 true ;


fail() 函数可以与其他 ostream 类的成员函数结合使用 ; 例如 : fail() 和 clear() 函数可以用于清除输出流的错误状态 ;


3、代码示例 - 二进制文件写入


代码示例 :

#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 . . .

在这里插入图片描述

写出的文件内容 :

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/han1202012/article/details/134960522