二进制文件读写,*读取文件头和文件尾
程序员文章站
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;
}
上一篇: 一个简单的web服务器
推荐阅读