头文件

1
#include <fstream>
  • 输入输出流:
    • std::ifstreamInput File Stream,用于从文件中读取数据。
    • std::ofstreamOutput File Stream,用于向文件中写入数据。
    • std::fstreamFile Stream,可以同时进行文件的读取和写入。

打开文件

  • open()函数
1
2
3
4
5
std::ofstream myOutputFile; // 用于写入
std::ifstream myInputFile; // 用于读取
// 打开文件
myOutputFile.open("data.txt");
myInputFile.open("data.txt");
  • 构造函数
1
2
std::ofstream myOutputFile("data.txt");
std::ifstream myInputFile("data.txt");
  • 检查是否打开文件
1
2
3
4
5
if (!myOutputFile.is_open()) {
// 报告错误并退出
std::cerr << "错误:无法打开文件用于写入!" << std::endl;
return 1; // 返回错误码
}

读写操作

  • 可以使用流操作符
1
2
3
4
5
6
7
8
// 写入
myOutputFile << "Hello, World!" << std::endl;
myOutputFile << 42 << std::endl;

// 读取
std::string line;
int number;
myInputFile >> line >> number; // 注意:>> 会以空白字符(空格、换行)为分隔
  • 也可使用get()getline()read(), write()等函数。

关闭文件

  • 操作完成后,务必关闭文件以释放系统资源,并将缓冲区中的数据全部写入磁盘。
1
2
myOutputFile.close();
myInputFile.close();

文件打开模式

  • std::ios::in
    • 输入模式:打开文件用于读取数据
  • std::ios::out
    • 输出模式:打开文件用于写入数据 ,默认会清空文件原有内容
  • std::ios::app
    • 追加模式:从文件末尾开始写入,保留原有内容。必须和 ios::out 配合使用。
  • std::ios::trunc
    • 截断模式:如果文件已存在,打开时清空其内容。这是 ios::out 的默认行为。
  • std::ios::binary
    • 二进制模式:以二进制(而不是文本)方式处理文件。

二进制读写

  • read()write() 是为二进制 (Binary) I/O 设计的,处理的是原始字节流。它们不关心数据是什么类型、代表什么意义,只是简单地将内存中的一块数据原封不动地(byte-for-byte)复制到文件,或者从文件复制到内存。

read()

  • 原型
1
istream& read(char* s, std::streamsize n);
  • char* s:这是一个指向内存块起始地址的指针。它告诉 read 函数应该把从文件读取的数据存放到哪里。注意这里不是 const,因为 read 函数会修改这块内存的内容。
  • std::streamsize n:要从文件中读取多少个字节

write()

  • 原型
1
ostream& write(const char* s, std::streamsize n);
  • const char* s:这是一个指向内存块起始地址的指针。它告诉 write 函数从哪里开始复制数据。
  • 因为 char 在 C++ 中被定义为1个字节大小,所以 char* 是一个可以指向任何字节序列的通用字节指针。
  • std::streamsize n:这是一个整数类型,表示要从起始地址 s 开始,连续写入多少个字节

文件定位

  • tellg()
    • 返回当前读取指针 (get pointer) 的位置(从文件开头计的字节数)。
  • tellp()
    • 返回当前写入指针 (put pointer) 的位置。对于 fstream,通常读写指针是同步的。
  • seekg(offset, dir)
    • 移动读取指针到指定位置。
    • offset: 偏移量(字节)。
    • dir: 起始位置。
  • seekp(offset, dir)
    • 移动写入指针到指定位置。参数与 seekg 相同。
  • dir (起始位置) 的可能值:
    • std::ios::beg,从文件开头计算偏移量。
    • std::ios::cur,从文件当前位置计算偏移量。
    • std::ios::end,从文件末尾计算偏移量
  • 例子
1
2
3
4
5
6
7
8
// 将读指针移动到文件开头
fs.seekg(0, std::ios::beg);

// 将写指针移动到文件末尾(用于追加)
fs.seekp(0, std::ios::end);

// 将读指针从当前位置向后移动10个字节
fs.seekg(10, std::ios::cur);

获取读写大小

  • 原型
1
std::streamsize gcount() const;
  • 返回上一次非格式化输入操作(Unformatted Input Operation)成功读取的字符数。
  • 非格式化:像 read(), getline(), get() 这样的函数,它们直接处理字符流