【C++】介绍 std::ifstream 输入文件流

例子:

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 是什么?

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

对应你代码的作用

cpp 复制代码
std::ifstream ifs(path, std::ios::binary);

这一行就是:

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


最终总结

  1. std::ifstream 是C++ 标准库中用于读文件的输入流类 ,必须包含 <fstream>
  2. 它继承自 std::istream,拥有和 cin 一致的读取语法
  3. ios::binary 是读取二进制文件(图像/视频)的必备模式
  4. 它会自动管理文件打开/关闭,是 C++ 最安全、最常用的文件读取方式
相关推荐
可乐鸡翅yeah_7 分钟前
hls.js 缓冲区参数 maxBufferLength、maxBufferSize 通俗讲解与业务调参
开发语言·javascript·ios·音视频·safari·m3u8
Wang's Blog9 分钟前
Java框架 SpringCloud 快速入门: 全局过滤器(GlobalFilter)自定义鉴权
java·开发语言·spring cloud
白山编程大哥12 分钟前
C语言篇:可变参数函数
c语言·开发语言
(Charon)15 分钟前
【C++面试】程序崩溃如何定位:从Segmentation fault到GDB、Core Dump与ASan
开发语言·c++
汉克老师18 分钟前
GESP2026年9月认证C++七级( 第三部分编程题(1、必经之路))精讲
c++·gesp·小学生·学c++编程
“AI国潮设计-小江”22 分钟前
《Python+SDXL实战:用ControlNet精准控制“英歌舞戚风蛋糕”质感,附批量生成脚本》
开发语言·人工智能·python·prompt·aigc
1024奇点27 分钟前
【仓颉语言入门 · 第26课】
开发语言·ide·开源
jayhgq29 分钟前
新一代Python包与项目管理工具——UV
开发语言·python·uv
xixiaoyunya29 分钟前
CPU 100% 本身不是问题,它是一个症状
开发语言·php
ebiobiz33 分钟前
Zig 嵌入式底层库选择与 build.zig 组织指南
c语言·c++·嵌入式硬件·mcu