欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-08 22:51:26
...
#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;
}

相关标签: 二进制