0

0

c++怎么读取二进制文件_c++二进制文件读取方法

穿越時空

穿越時空

发布时间:2025-10-02 15:29:02

|

163人浏览过

|

来源于php中文网

原创

答案是使用std::ifstream以ios::binary模式读取二进制文件,通过read()方法获取原始字节,可一次性或分块读取,并注意检查流状态和结构体对齐问题。

c++怎么读取二进制文件_c++二进制文件读取方法

在C++中读取二进制文件,主要使用标准库中的 fstream 类,并以二进制模式打开文件。关键在于使用 ios::binary 标志,避免文本模式下的自动字符转换(如换行符处理),确保数据原样读取。

1. 使用 ifstream 读取二进制文件

通过 std::ifstream 打开文件时指定 ios::binary 模式,然后用 read() 方法读取原始字节

示例代码:

#include 
#include
#include

int main() {
std::ifstream file("data.bin", std::ios::binary);
if (!file) {
std::cerr << "无法打开文件!" << std::endl;
return -1;
}

// 获取文件大小
file.seekg(0, std::ios::end);
size_t fileSize = file.tellg();
file.seekg(0, std::ios::beg);

// 分配内存
std::vector buffer(fileSize);

// 读取数据
file.read(buffer.data(), fileSize);
if (file.gcount() != static_cast(fileSize)) {
std::cerr << "读取不完整!" << std::endl;
}

file.close();

// 此时 buffer 中存放了完整的二进制数据
// 可根据需要解析,例如 reinterpret_cast 成特定结构体指针
return 0;
}

2. 逐块读取大文件

对于大文件,不建议一次性加载到内存。可以分块读取,减少内存占用

立即学习C++免费学习笔记(深入)”;

std::ifstream file("large.bin", std::ios::binary);
if (!file) { /* 错误处理 */ }

const size_t chunkSize = 4096;
std::vector chunk(chunkSize);

while (file.read(chunk.data(), chunkSize) || file.gcount() > 0) {
std::streamsize bytesRead = file.gcount();
// 处理 chunk 中的前 bytesRead 字节
}

燕雀Logo
燕雀Logo

为用户提供LOGO免费设计在线生成服务

下载

3. 读取结构化二进制数据

若文件保存的是结构体或类对象,写入时是直接 write 整个对象,读取时也可用 read 直接还原。

定义结构体:

struct Data {
int id;
double value;
char name[32];
};

读取结构体:

std::ifstream file("data.bin", std::ios::binary);
Data d;
if (file.read(reinterpret_cast(&d), sizeof(Data))) {
std::cout << "ID: " << d.id << ", Value: " << d.value << std::endl;
} else {
std::cerr << "读取结构体失败" << std::endl;
}

注意: 结构体读写需保证字节对齐和跨平台兼容性,否则可能出错。

4. 检查读取状态

读取后应检查流状态,确保操作成功:

  • file.good():一切正常
  • file.fail():操作失败(格式或IO错误)
  • file.eof():到达文件末尾
  • file.gcount():上次 read() 实际读取的字节数

基本上就这些。核心是 open 时加 binary 模式,用 read() 读原始字节,注意大小和类型转换。

相关专题

更多
golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

197

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

190

2025.07.04

C++类型转换方式
C++类型转换方式

本专题整合了C++类型转换相关内容,想了解更多相关内容,请阅读专题下面的文章。

299

2025.07.15

html编辑相关教程合集
html编辑相关教程合集

本专题整合了html编辑相关教程合集,阅读专题下面的文章了解更多详细内容。

37

2026.01.21

三角洲入口地址合集
三角洲入口地址合集

本专题整合了三角洲入口地址合集,阅读专题下面的文章了解更多详细内容。

18

2026.01.21

AO3中文版入口地址大全
AO3中文版入口地址大全

本专题整合了AO3中文版入口地址大全,阅读专题下面的的文章了解更多详细内容。

233

2026.01.21

妖精漫画入口地址合集
妖精漫画入口地址合集

本专题整合了妖精漫画入口地址合集,阅读专题下面的文章了解更多详细内容。

61

2026.01.21

java版本选择建议
java版本选择建议

本专题整合了java版本相关合集,阅读专题下面的文章了解更多详细内容。

3

2026.01.21

Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

14

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 4万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号