例子:

//  读取 YUV 数据
uint32_t size = width * height * 3 / 2;
std::vector<unsigned char> in_buf(size), out_buf(size);
std::ifstream ifs(path, std::ios::binary);
if (!ifs) { std::cerr << "Open failed: " << path << std::endl; return -1; }
ifs.read((char*)in_buf.data(), size);

详细介绍:std::ifstream

std::ifstream 是 C++ 标准库中的一个类,全称是 input file stream(输入文件流),属于 <fstream> 头文件,专门用于从文件中读取数据

它是 C++ 面向对象的文件操作核心类,你可以把它理解成一个专门用来读文件的“工具对象”,自带打开、读取、关闭、检查错误等所有文件操作功能。


1. 完整定义与归属

  • 定义在标准头文件:<fstream>
  • 属于命名空间:std
  • 完整写法:std::ifstream
  • 父类(继承关系):
    std::istream (通用输入流)
            ↑
    std::ifstream (文件输入流)
    

这意味着:它拥有所有 cin(标准输入)的用法,同时额外增加了文件操作功能。


2. 核心作用

std::ifstream 唯一的用途:
以各种方式读取文件里的数据(文本、二进制、图片、视频、音频都可以)
❌ 不能用来写文件(写文件用 std::ofstream


3. 常用构造函数(创建对象的方式)

(1)空对象,之后再打开

std::ifstream ifs;       // 创建对象
ifs.open("test.yuv");    // 手动打开文件

(2)创建时直接打开文件(最常用)

std::ifstream ifs("文件路径", 打开模式);

你代码里的写法

std::ifstream ifs(path, std::ios::binary);
  • path:文件路径字符串
  • std::ios::binary二进制模式打开(不转换换行符,原样读字节)

4. 最常用的成员函数

read() —— 读取二进制数据(你代码里用的)

ifs.read(缓冲区指针, 要读取的字节数);
  • 专门用来读取图片、视频、结构体、二进制文件
  • 一次读取指定长度的字节,不会做任何格式转换

你代码:

ifs.read((char*)in_buf.data(), size);

含义:从文件读 size 个字节,存入 in_buf 数组。


operator>> —— 读取文本(类似 cin)

int a;
ifs >> a;          // 从文件读一个整数
std::string s;
ifs >> s;          // 从文件读一个字符串

getline() —— 按行读取文本

std::string line;
std::getline(ifs, line);

is_open() / !ifs —— 判断是否打开成功

if (!ifs) {
    // 打开失败
}

// 等价于
if (!ifs.is_open()) {
}

close() —— 手动关闭文件

ifs.close();

注意ifstream 对象销毁时会自动关闭文件,通常不需要手动调用。


5. 重要打开模式

配合 ifstream 使用,控制怎么读文件:

模式 作用
std::ios::in 默认模式,只读打开
std::ios::binary 二进制模式(必须加!读图片/视频/任意原始字节)
std::ios::ate 打开后直接跳到文件末尾

你代码里的 binary 非常关键:

  • 不加:会把文件当作文本,自动转换换行符,破坏图片/视频数据
  • 加:原样读取所有字节,适合 YUV、RGB、H.264 等二进制格式

6. 与 std::istream / cin 的关系

  • std::cin控制台输入流
  • std::ifstream文件输入流
  • 两者用法几乎一样!
// 从控制台读
int a;
std::cin >> a;

// 从文件读(一模一样)
int b;
std::ifstream ifs("a.txt");
ifs >> b;

7. 简单总结:std::ifstream 是什么?

  1. 是 C++ 标准库提供的类
  2. 专门用于读取文件
  3. 面向对象、安全、自动管理资源
  4. 支持文本读取二进制读取
  5. ios::binary 才能正确读取图像、视频等非文本文件
  6. 不需要手动关闭文件(对象析构时自动关闭)

对应你代码的作用

std::ifstream ifs(path, std::ios::binary);

这一行就是:
创建一个文件输入流对象,以二进制只读模式打开 YUV 图像文件,准备读取原始字节数据。


最终总结

  1. std::ifstreamC++ 标准库中用于读文件的输入流类,必须包含 <fstream>
  2. 它继承自 std::istream,拥有和 cin 一致的读取语法
  3. ios::binary 是读取二进制文件(图像/视频)的必备模式
  4. 它会自动管理文件打开/关闭,是 C++ 最安全、最常用的文件读取方式

更多推荐