例子:
cpp
// 读取 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)空对象,之后再打开
cpp
std::ifstream ifs; // 创建对象
ifs.open("test.yuv"); // 手动打开文件
(2)创建时直接打开文件(最常用)
cpp
std::ifstream ifs("文件路径", 打开模式);
你代码里的写法:
cpp
std::ifstream ifs(path, std::ios::binary);
path:文件路径字符串std::ios::binary:二进制模式打开(不转换换行符,原样读字节)
4. 最常用的成员函数
① read() ------ 读取二进制数据(你代码里用的)
cpp
ifs.read(缓冲区指针, 要读取的字节数);
- 专门用来读取图片、视频、结构体、二进制文件
- 一次读取指定长度的字节,不会做任何格式转换
你代码:
cpp
ifs.read((char*)in_buf.data(), size);
含义:从文件读 size 个字节,存入 in_buf 数组。
② operator>> ------ 读取文本(类似 cin)
cpp
int a;
ifs >> a; // 从文件读一个整数
std::string s;
ifs >> s; // 从文件读一个字符串
③ getline() ------ 按行读取文本
cpp
std::string line;
std::getline(ifs, line);
④ is_open() / !ifs ------ 判断是否打开成功
cpp
if (!ifs) {
// 打开失败
}
// 等价于
if (!ifs.is_open()) {
}
⑤ close() ------ 手动关闭文件
cpp
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是文件输入流- 两者用法几乎一样!
cpp
// 从控制台读
int a;
std::cin >> a;
// 从文件读(一模一样)
int b;
std::ifstream ifs("a.txt");
ifs >> b;
7. 简单总结:std::ifstream 是什么?
- 是 C++ 标准库提供的类
- 专门用于读取文件
- 面向对象、安全、自动管理资源
- 支持文本读取 和二进制读取
- 用
ios::binary才能正确读取图像、视频等非文本文件 - 不需要手动关闭文件(对象析构时自动关闭)
对应你代码的作用
cpp
std::ifstream ifs(path, std::ios::binary);
这一行就是:
创建一个文件输入流对象,以二进制只读模式打开 YUV 图像文件,准备读取原始字节数据。
最终总结
std::ifstream是C++ 标准库中用于读文件的输入流类 ,必须包含<fstream>- 它继承自
std::istream,拥有和cin一致的读取语法 ios::binary是读取二进制文件(图像/视频)的必备模式- 它会自动管理文件打开/关闭,是 C++ 最安全、最常用的文件读取方式