打开文件,Open

1
2
3
std::ifstream yuv_file;

yuv_file.open("400_300_25.yuv", std::ios::binary);

第二个参数_Mode默认值为 ios_base::in,表示以只读模式打开文件。常见的模式包括:

  • ios_base::in:以输入(读)模式打开文件。
  • ios_base::out:以输出(写)模式打开文件。
  • ios_base::binary:以二进制模式打开文件。
  • ios_base::app:以追加模式打开文件,写入的内容会追加到文件末尾。
  • ios_base::trunc:如果文件存在,则在打开时将其长度截断为 0(通常与 ios_base::out 一起使用)。
  • ios_base::ate:在打开文件时定位到文件末尾。

移动文件,seekg

1
2
3
std::ifstream yuv_file;

yuv_file.seekg(0, ios::end);

seekg 是 C++ 标准库中用于操作输入文件流(如 std::ifstream)位置的成员函数。seekg 的功能是将文件流的“读指针”移动到指定的位置,从而控制从文件中读取数据的位置。

seekg有两个重载版本:

1
2
std::istream& seekg(std::streampos pos);
std::istream& seekg(std::streamoff off, std::ios_base::seekdir dir);

参数说明

  1. seekg(std::streampos pos):

    • pos: 一个绝对位置(std::streampos 类型),表示要将文件指针移动到文件的哪个字节位置。这是一个文件中的字节偏移量,通常相对于文件的起始位置。
  2. seekg(std::streamoff off, std::ios_base::seekdir dir):

    • off: 一个相对偏移量(std::streamoff 类型),表示要从指定的基准位置移动多少字节。
    • dir: 一个枚举类型(std::ios_base::seekdir),用于指定偏移量的基准位置。它可以取以下值:
      • std::ios_base::beg: 基于文件的起始位置进行偏移。
      • std::ios_base::cur: 基于当前读指针位置进行偏移。
      • std::ios_base::end: 基于文件的末尾进行偏移。

示例代码

1
2
3
4
std::ifstream yuv_file("400_300_25.yuv", std::ios::binary);
yuv_file.seekg(0, std::ios::end);
std::streampos file_size = yuv_file.tellg(); // 获取文件大小
yuv_file.seekg(0, std::ios::beg); // 重新将读指针移动到文件开头

读取指针位置,tellg

tellg 是 C++ 标准库中的一个成员函数,通常用于文件输入流(如 std::ifstream)中。它的主要作用是返回文件流的当前读指针位置,即返回当前文件读取位置的偏移量(以字节为单位)。

使用场景

  1. 获取文件大小:通过将读指针移动到文件末尾,然后使用 tellg 获取文件大小。
  2. 检查文件流中的当前位置:在处理文件流时,可以随时使用 tellg 检查当前读指针的位置,以便在处理过程中准确定位文件中的数据。
  3. 保存和恢复读指针位置:你可以使用 tellg 保存当前读指针位置,在需要时使用 seekg 恢复到这个位置,方便文件的随机访问。

示例代码

1
2
3
4
if (yuv_file.tellg() == file_size)  // 如果文件到头了
{
yuv_file.seekg(0, ios::beg); // 就将文件移动到开头位置,用于循环播放
}