二进制文件读写,自由读取文件头和文件尾

#include <iostream>
#include <fstream>
#include <string.h>

using namespace std;

struct FileHead {
    char file_types[12]; // 文件类型
    int  file_size;     // 文件大小
    int  beg_pos; // 数据开始位置
    int  data_length;  // 数据长度
    int  int_size;     // int 数据数量
    int  double_size;  // double 数据数量

};

void Printf_FileHead(FileHead & fh)
{
    cout << fh.file_types << "\t";
    cout << fh.file_size << "\t";
    cout << fh.beg_pos << "\t";
    cout << fh.data_length << "\t";
    cout << fh.int_size << "\t";
    cout << fh.double_size << endl;
}

int main()
{
    FileHead file_head;
    file_head.beg_pos = sizeof(file_head);
    file_head.int_size = 5;
    file_head.double_size = 5;
    file_head.data_length = 4 * file_head.int_size + 8 * file_head.double_size; // 5个整数和五个浮点数
    strcpy(file_head.file_types, "DataBin文件");

    int iNum[5] = {0x12345678, 1, 0xABCD, 3, 255};
    double dNum[5] = {11.1 , 108.0};
    char end_mark[] = "欢迎使用 Code::Blocks svn build!\n"
                      "Code::Blocks 是一款功能强大的IDE (集成开发环境),力求为开发者(个人或团队)提供一个能满足各种需求的优秀编程环境。\n"
                      "它的插件架构使得开发者可以编写插件,从而添加各种各样的功能。\n";

    ofstream fout("data.bin", ios::binary);

    fout.write((char *)(&file_head), sizeof(file_head)); // 预写文件头



    // 二进制读写是把 每一个字节转换成 char 写到文件里的
    fout.write((char *)(&iNum), 5 * sizeof(int)); //  5个 int类型写入
    fout.write((char *)(&dNum) , sizeof(dNum));  //  整个 dNum数组

    int end_pos = fout.tellp();  // 数据结束pos

    fout.write(end_mark , strlen(end_mark));   //  整个 dNum数组

    cout << "写入字节(数据和end_mark):" << 5 * sizeof(int) + sizeof(dNum) + strlen(end_mark) << endl;

    file_head.file_size = fout.tellp();
    fout.seekp(0, ios::beg);
    fout.write((char *)(&file_head), sizeof(file_head)); // 修改文件头

    Printf_FileHead(file_head);

    fout.clear();
    fout.close();



    int i_read;
    double d_reade;
    ifstream fin("data.bin", ios::binary);

    // 获得文件长度
    fin.seekg(0, ios::end);
    int length = fin.tellg();
    fin.seekg(0, ios::beg);
    cout << "data.bin 文件长度:" << length << endl;
    // 读文件头
    FileHead fh;
    fin.seekg(0, ios::beg);
    fin.read((char *)(&fh), sizeof(fh));
    Printf_FileHead(fh);


    // 读文件结束标记
    char mark[512] = "";
    fin.seekg(end_pos, ios::beg);
    fin.read(mark,  length - end_pos);
    cout << mark << endl;

    // 读取数据
    fin.seekg(file_head.beg_pos); // 移到数据区
    fin.seekg(4 * sizeof(int), ios::cur); // 移动到 第五个整数
    fin.read((char *)(&i_read), sizeof(i_read));
    cout << i_read << endl;

    fin.seekg(sizeof(double), ios::cur);  // 跳过第一个浮点数
    fin.read((char *)(&d_reade), sizeof(d_reade));
    cout << d_reade << endl;

    fin.clear();
    fin.close();
    return 0;
}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值