2026-10-21 07:07:11
在C++中,通过fstream类进行二进制文件操作需包含<fstream>头文件,核心方法包括read/write、seekg/seekp及文件状态检查。以下是具体实现方法及注意事项:
一、读取二进制文件打开文件:使用std::ifstream并指定std::ios::binary模式,必须检查文件是否成功打开。
#include <fstream>#include <vector>#include <iostream>int main() { std::ifstream file("data.bin", std::ios::binary); if (!file) { std::cerr << "无法打开文件!" << std::endl; return -1; }获取文件大小:通过seekg移动到文件末尾,用tellg获取位置(即文件大小),再回到文件头。
file.seekg(0, std::ios::end);size_t fileSize = file.tellg();file.seekg(0, std::ios::beg);分配缓冲区并读取数据:使用std::vector<char>动态分配内存,通过read读取全部数据,并检查实际读取字节数。
std::vector<char> buffer(fileSize);file.read(buffer.data(), fileSize);if (file.gcount() != static_cast<std::streamsize>(fileSize)) { std::cerr << "读取文件时发生错误!" << std::endl; return -1;}file.close();std::cout << "成功读取 " << fileSize << " 字节。" << std::endl;return 0;打开文件:使用std::ofstream并指定std::ios::binary模式,检查文件是否成功创建。
#include <fstream>#include <iostream>int main() { int data[] = {10, 20, 30, 40, 50}; int size = 5; std::ofstream file("output.bin", std::ios::binary); if (!file) { std::cerr << "无法创建文件!" << std::endl; return -1; }写入数据:通过write写入原始字节,需用reinterpret_cast转换指针类型(如整型数组转为const char*)。
file.write(reinterpret_cast<const char*>(data), size * sizeof(int));file.close();std::cout << "数据已写入 output.bin" << std::endl;return 0;定义结构体:注意内存对齐和字节序问题(跨平台时可能不兼容)。
struct Person { char name[50]; int age;};写入结构体:直接使用write写入整个结构体对象。
Person p = {"Tom", 25};std::ofstream out("person.bin", std::ios::binary);out.write(reinterpret_cast<const char*>(&p), sizeof(Person));out.close();读取结构体:使用read读取数据到结构体变量。
std::ifstream in("person.bin", std::ios::binary);Person p2;in.read(reinterpret_cast<char*>(&p2), sizeof(Person));in.close();std::cout << "姓名: " << p2.name << ", 年龄: " << p2.age << std::endl;掌握上述方法后,可高效处理二进制文件,适用于配置存储、序列化、图像/音频处理等场景。