C++实战之二进制数据处理与封装

C++实战之二进制数据处理与封装

本文主要介绍C++中二进制数据的处理与封装的相关知识,包括二进制文件处理、封装、读写二进制数据等方面。

一、二进制文件处理

  1. 打开二进制文件
#include <iostream>
#include <fstream>
using namespace std;

int main() {
  //打开二进制文件
  ifstream fin("test.bin", ios::binary);

  if (fin) {
    cout << "Open file success." << endl;
  } else {
    cout << "Open file fail." << endl;
  }

  fin.close(); //关闭文件
  return 0;
}

在打开文件时,需要设置打开模式为ios::binary,用于指明以二进制模式打开。

  1. 读取二进制文件
#include <iostream>
#include <fstream>
using namespace std;

int main() {
  ifstream fin("test.bin", ios::binary);

  if (fin) {
    // 获取文件大小
    fin.seekg(0, ios::end); // 定位到文件结尾
    int fileSize = fin.tellg(); // 获取当前位置,即文件大小
    fin.seekg(0, ios::beg); // 定位到文件开头

    // 读取文件内容
    char* buffer = new char[fileSize]; // 用于存储文件内容的缓冲区
    fin.read(buffer, fileSize); // 读取文件内容
    fin.close(); // 关闭文件

    // 处理文件内容
    // ...

    delete[] buffer; // 释放缓冲区
  } else {
    cout << "Open file fail." << endl;
  }

  return 0;
}

首先,需要通过seekg函数将文件指针定位到文件开头,获取文件大小,再次定位到文件开始位置,然后开辟相应大小的缓冲区读取文件内容。

  1. 写入二进制文件
#include <iostream>
#include <fstream>
using namespace std;

int main() {
  ofstream fout("test.bin", ios::binary);

  if (fout) {
    // 写入文件内容
    int data = 100;
    fout.write((char*)&data, sizeof(int)); // 写入整型数据

    fout.close(); // 关闭文件
  } else {
    cout << "Open file fail." << endl;
  }

  return 0;
}

使用ofstream类创建文件,并设置打开模式为ios::binary,将数据写入文件。

二、封装二进制数据

在C++中,struct和class均可用来封装二进制数据。

示例1:封装整型数据

#include <iostream>
#include <fstream>
using namespace std;

class Int {
public:
  Int() {}
  Int(int v) : value(v) {}

  int value;
};

int main() {
  ofstream fout("test.bin", ios::binary);

  if (fout) {
    Int data(100); // 封装数据
    fout.write((char*)&data, sizeof(Int)); // 写入数据

    fout.close(); // 关闭文件
  } else {
    cout << "Open file fail." << endl;
  }

  return 0;
}

定义一个Int类,封装整型数据,并通过write函数将数据写入文件。

示例2:封装结构体

#include <iostream>
#include <fstream>
using namespace std;

struct Student {
  int id;
  float score;
};

int main() {
  ofstream fout("test.bin", ios::binary);

  if (fout) {
    Student stu = { 1, 90.5 }; // 封装数据
    fout.write((char*)&stu, sizeof(Student)); // 写入数据

    fout.close(); // 关闭文件
  } else {
    cout << "Open file fail." << endl;
  }

  return 0;
}

定义一个结构体Student,并通过write函数将数据写入文件。

三、读写二进制数据

使用read函数和write函数可实现二进制数据的读写操作。

示例1:读取整型数据

#include <iostream>
#include <fstream>
using namespace std;

class Int {
public:
  Int() {}
  Int(int v) : value(v) {}

  int value;
};

int main() {
  ifstream fin("test.bin", ios::binary);

  if (fin) {
    Int data; // 定义变量
    fin.read((char*)&data, sizeof(Int)); // 读取数据
    fin.close(); // 关闭文件

    cout << data.value << endl; // 输出数据
  } else {
    cout << "Open file fail." << endl;
  }

  return 0;
}

使用read函数读取数据,并将数据存储到变量中,最后输出数据。

示例2:读取结构体数据

#include <iostream>
#include <fstream>
using namespace std;

struct Student {
  int id;
  float score;
};

int main() {
  ifstream fin("test.bin", ios::binary);

  if (fin) {
    Student stu; // 定义变量
    fin.read((char*)&stu, sizeof(Student)); // 读取数据
    fin.close(); // 关闭文件

    cout << stu.id << " " << stu.score << endl; // 输出数据
  } else {
    cout << "Open file fail." << endl;
  }

  return 0;
}

使用read函数读取数据,并将数据存储到变量中,最后输出数据。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实战之二进制数据处理与封装 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • freemodbus线圈中的位操作

    Freemodbus线圈中的位操作 在Freemodbus中,线圈是指一组逻辑变量,每个线圈只能有两种状态:开和关。线圈在Modbus通信协议中用于表示设备的输出状态,通常用于控制设备的开关以及判断设备的状态。 但是,在实际的应用中,我们很可能需要使用位操作来将多个线圈合并在一起,使用一个16位寄存器表示多个线圈的状态。Freemodbus提供了一些函数来帮…

    其他 2023年3月28日
    00
  • python查找特定名称文件并按序号、文件名分行打印输出的方法

    要查找特定名称的文件并按照序号、文件名分行打印输出,我们可以使用Python中的os和re模块提供的功能。 以下是详细的步骤: 导入必要模块 首先,我们需要导入两个模块:os和re。os模块将帮助我们搜索目录中的文件,而re模块将帮助我们匹配特定名称文件。 import os import re 定义文件名模式 接下来,我们需要定义文件名模式。为此,我们可以…

    other 2023年6月27日
    00
  • powershell使用ssh

    当然,我很乐意为您提供有关“PowerShell使用SSH”的完整攻略。以下是详细的步骤和两个示例: 1. 什么是SSH? SSH(Secure Shell)是一种加密网络协议,用于在不安全的网络上安全地传输数据。SSH协议可以用于远程登录和执行命令,以及在本地和远程系统之间传输文件。 2. PowerShell使用SSH 以下是使用PowerShell使用…

    other 2023年5月6日
    00
  • mysql中delete多表关联删除数据

    在MySQL中,可以使用DELETE语句删除多个表中的数据。本文将提供一个完整的攻略,介绍如何使用MySQL中的DELETE语句删除多个表中的数据,并提供两示例说明。 步骤1:创建多个表 在删除多个表中的数据之前,需要创建多个表。可以按照以下步骤创建两个表: CREATE TABLE users ( id INT PRIMARY KEY, name VARC…

    other 2023年5月8日
    00
  • Win10 Mobile Build 15254.544正式版累积更新推送: 补丁型号KB4478936

    Win10 Mobile Build 15254.544正式版累积更新推送: 补丁型号KB4478936攻略 简介 Win10 Mobile Build 15254.544正式版累积更新是针对Windows 10 Mobile操作系统的一个重要更新。该更新的补丁型号为KB4478936。本攻略将详细介绍如何安装和应用这个累积更新。 步骤 检查更新可用性:首先…

    other 2023年8月3日
    00
  • 易语言将指定的主机名与IP地址转换功能

    易语言将指定的主机名与IP地址转换功能攻略 简介 易语言是一种面向中文编程的高级编程语言,它提供了一些方便的网络编程功能,包括将主机名与IP地址进行转换的功能。这个功能可以帮助我们在网络编程中快速获取主机名对应的IP地址,或者获取IP地址对应的主机名。 步骤 步骤一:导入网络编程模块 首先,我们需要导入易语言的网络编程模块,以便使用其中的函数和方法。在易语言…

    other 2023年7月30日
    00
  • 苹果系统占用内存太大怎么办 手把手教你清理手机内存方法

    苹果系统占用内存太大的解决方法 苹果系统占用过多内存可能导致手机运行缓慢或出现其他问题。下面是一些手把手教你清理手机内存的方法,帮助你解决这个问题。 方法一:清理无用的应用程序 打开手机主屏幕,找到并点击“设置”图标。 在设置界面中,向下滑动并点击“通用”选项。 在通用设置中,继续向下滑动并点击“iPhone存储空间”。 等待片刻,系统会列出所有已安装应用程…

    other 2023年8月1日
    00
  • 电脑禁用迅雷插件后谷歌浏览器还是会自动默认迅雷下载如何处理

    以下是“电脑禁用迅雷插件后谷歌浏览器还是会自动默认迅雷下载如何处理”的完整攻略: 电脑禁用迅雷插件后谷歌浏览器还是会自动默认迅雷下载如何处理 在使用谷歌浏览器下载文件时,有时会出现默认使用迅雷下载的情况。即使我们已经禁用了迅雷插件,谷歌浏览器仍然会自动使用迅雷下载。本攻略将详细讲解如何处理这种情况。 方法一:更改下载设置 我们可以通过更改谷歌浏览器的下载设置…

    other 2023年5月8日
    00
合作推广
合作推广
分享本页
返回顶部