【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::ifstreamC++ 标准库中用于读文件的输入流类 ,必须包含 <fstream>
  2. 它继承自 std::istream,拥有和 cin 一致的读取语法
  3. ios::binary 是读取二进制文件(图像/视频)的必备模式
  4. 它会自动管理文件打开/关闭,是 C++ 最安全、最常用的文件读取方式
相关推荐
罗超驿1 小时前
13.JavaScript 新手入门指南:语法、变量、流程控制全解析
开发语言·javascript
MC皮蛋侠客1 小时前
C++17 多线程系列(十):多线程性能优化——从测量到调优
c++·多线程
yingjie1101 小时前
Scanpy vs Seurat 深度对比:Python 与 R 的单细胞分析框架谁更强?
开发语言·python·r语言·生物信息学·单细胞转录组·seurat·scanpy
程序大视界1 小时前
【C++ 从基础到项目实战】C++(六):拷贝控制——浅拷贝与深拷贝,兼谈智能指针
开发语言·c++·cpp
luck_bor1 小时前
IO流知识点笔记
java·开发语言·笔记
程序大视界2 小时前
【Python系列课程】Pandas(四):数据统计与排序——describe、sort_values、sample
开发语言·python·pandas
KWTXX2 小时前
使用matlab官网的skills调用claude-待完成
开发语言·matlab
Cthy_hy2 小时前
Python算法竞赛:排列组合核心用法
开发语言·python·算法