前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【C++】输入输出流 ⑪ ( 文件流 | 二进制形式打开文件 | 二进制文件读取 | read 函数 | gcount 函数 | 二进制文件写出 | write 函数 | fail 函数 )

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

作者头像
韩曙亮
发布2023-12-18 12:48:41
7300
发布2023-12-18 12:48:41
举报
文章被收录于专栏:韩曙亮的移动开发专栏
文章目录

  • 一、二进制形式打开文件
    • 1、二进制文件简介
    • 2、以二进制形式打开文件参数
  • 二、二进制文件读取
    • 1、二进制文件读取 - read() 函数
    • 2、获取实际读取的字节数 - gcount() 函数
    • 3、代码示例 - 文件读取
  • 三、二进制文件写出
    • 1、二进制文件写出 - write() 函数
    • 2、验证输出是否出错 - fail() 函数
    • 3、代码示例 - 二进制文件写入

一、二进制形式打开文件


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 函数 , 可以对二进制文件进行读写操作 , 函数原型如下 :

代码语言:javascript
复制
istream& read(char *buffer,int len);
ostream& write(const char * buffer,int len);

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

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

ifstream 继承 istream 类 ;

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

代码语言:javascript
复制
istream& read(char *buffer, int len);

这个函数有两个参数:

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

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

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

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

代码语言:javascript
复制
streamsize gcount();

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

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

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

3、代码示例 - 文件读取

在下面的代码中 , 先在 资源文件 中创建二进制文件 1.bin ;

在这里插入图片描述
在这里插入图片描述

然后 以二进制形式打开 1.bin 二进制文件 ,

代码语言:javascript
复制
ifstream ifs("1.bin", ios::binary);

最后 , 调用 read() 函数 , 读取文件中的数据 ;

代码语言:javascript
复制
ifs.read(buffer, len);

代码示例 :

代码语言:javascript
复制
#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;
};

执行结果 :

代码语言:javascript
复制
文件打开
读取完毕
Press any key to continue . . .
在这里插入图片描述
在这里插入图片描述

三、二进制文件写出


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

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

ofstream 继承 ostream 类 ;

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

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

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

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

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

代码语言:javascript
复制
bool fail() const;

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

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

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

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

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

代码示例 :

代码语言:javascript
复制
#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;
};

执行结果 :

代码语言:javascript
复制
文件打开成功
写出完毕
Press any key to continue . . .
在这里插入图片描述
在这里插入图片描述

写出的文件内容 :

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-12-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、二进制形式打开文件
    • 1、二进制文件简介
      • 2、以二进制形式打开文件参数
      • 二、二进制文件读取
        • 1、二进制文件读取 - read() 函数
          • 2、获取实际读取的字节数 - gcount() 函数
            • 3、代码示例 - 文件读取
            • 三、二进制文件写出
              • 1、二进制文件写出 - write() 函数
                • 2、验证输出是否出错 - fail() 函数
                  • 3、代码示例 - 二进制文件写入
                  相关产品与服务
                  数据保险箱
                  数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档