C++流类库 文件流操作

在 C++ 开发中,数据的持久化存储(读取文件、写入文件)是核心功能之一。C++ 流类库提供了面向对象、类型安全、使用简洁文件流 操作,通过 fstream 头文件中的三个文件流类,即可完成文本文件、二进制文件的读写。

本文从文件流类概述、文件打开与关闭、文本文件读写、二进制文件读写、文件定位五大核心模块,带你完全掌握 C++ 文件流操作。


一、C++ 文件流类概述

文件流是流类库专门用于文件操作的子类,包含在 <fstream> 头文件中。

1. 三大核心文件流类

表格

类名 作用 继承关系 常用操作
ifstream 只读文件流 继承自 istream 从文件读取数据
ofstream 只写文件流 继承自 ostream 向文件写入数据
fstream 可读可写文件流 继承自 iostream 同时读写文件

2. 文件操作基本流程

  1. 包含头文件 <fstream>
  2. 创建文件流对象
  3. 打开文件(指定打开方式)
  4. 读写数据
  5. 关闭文件

二、文件打开模式(重要)

使用文件流必须指定打开模式,决定文件如何被操作。

常用打开模式

表格

模式 含义
ios::in 只读方式打开(ifstream 默认)
ios::out 只写方式打开(ofstream 默认)覆盖原有内容
ios::app 追加写入,不覆盖原有内容
ios::binary 二进制模式打开
ios::trunc 打开时清空文件
ios::ate 打开后定位到文件末尾

组合使用

| 连接多种模式:

cpp 复制代码
// 二进制 + 只读
ios::in | ios::binary

三、文件打开与关闭

1. 打开文件两种方式

方式 1:构造函数直接打开

cpp 复制代码
ofstream fout("test.txt", ios::out);

方式 2:先创建对象,再调用 open()

cpp 复制代码
ofstream fout;
fout.open("test.txt", ios::out);

2. 判断文件是否打开成功

必须判断!避免文件不存在 / 权限不足导致错误:

cpp 复制代码
if (!fout.is_open()) {
    cout << "文件打开失败!" << endl;
}

3. 关闭文件

操作完成后必须关闭,释放系统资源:

cpp 复制代码
fout.close();

四、文本文件操作(最常用)

文本文件以字符形式存储,可直接用记事本打开。

1. 文本文件写入(ofstream)

cpp 复制代码
#include <iostream>
#include <fstream>
using namespace std;

int main() {
    // 1. 创建写文件流
    ofstream fout("info.txt", ios::out);

    // 2. 判断是否打开成功
    if (!fout.is_open()) {
        cout << "打开失败" << endl;
        return 1;
    }

    // 3. 写入数据(和 cout 用法一样)
    fout << "姓名:张三" << endl;
    fout << "年龄:20" << endl;
    fout << "身高:175.5" << endl;

    // 4. 关闭文件
    fout.close();
    cout << "写入完成" << endl;
    return 0;
}
  1. 文本文件读取(ifstream)
cpp 复制代码
int main() {
    ifstream fin("info.txt", ios::in);

    if (!fin.is_open()) {
        cout << "打开失败" << endl;
        return 1;
    }

    // 方法1:按字符串读取
    string str;
    while (fin >> str) {  // 读到文件末尾自动结束
        cout << str << endl;
    }

    // 方法2:按行读取
    // char buf[1024];
    // while (fin.getline(buf, sizeof(buf))) {
    //     cout << buf << endl;
    // }

    fin.close();
    return 0;
}

五、二进制文件操作

二进制文件直接存储字节,速度更快、安全性更高,常用于图片、音频、结构体等。

关键函数

写:write(指针,大小)

读:read(指针,大小)

1. 二进制写入

cpp 复制代码
// 结构体
struct Person {
    char name[20];
    int age;
};

int main() {
    // 二进制写
    ofstream fout("person.bin", ios::out | ios::binary);

    Person p = {"李四", 22};
    fout.write((const char*)&p, sizeof(Person));

    fout.close();
    return 0;
}
  1. 二进制读取
cpp 复制代码
int main() {
    ifstream fin("person.bin", ios::in | ios::binary);

    Person p;
    fin.read((char*)&p, sizeof(Person));

    cout << p.name << " " << p.age << endl;

    fin.close();
    return 0;
}

六、文件随机读写(文件指针定位)

通过移动文件指针,实现任意位置读写

核心函数

  1. 输出流(写)seekp(偏移量,基准位置)
  2. 输入流(读)seekg(偏移量,基准位置)

基准位置

ios::beg:文件开头

ios::cur:当前位置

ios::end:文件末尾

示例:

cpp 复制代码
// 定位到文件开头
fin.seekg(0, ios::beg);

// 定位到文件末尾
fin.seekg(0, ios::end);

// 获取当前指针位置
int pos = fin.tellg();

七、文件流常用判断函数

表格

函数 作用
is_open() 文件是否成功打开
good() 流状态正常
eof() 是否到达文件末尾
fail() 操作失败
clear() 清除流错误状态

八、完整综合示例(可读可写 fstream)

cpp 复制代码
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main() {
    // 可读可写
    fstream fs("test.txt", ios::in | ios::out | ios::app);

    if (!fs.is_open()) {
        cout << "打开失败" << endl;
        return 1;
    }

    // 写入
    fs << "追加一行数据" << endl;

    // 重新定位到开头读取
    fs.seekg(0, ios::beg);

    // 读取
    string str;
    while (getline(fs, str)) {
        cout << str << endl;
    }

    fs.close();
    return 0;
}

九、总结(核心要点)

  1. 文件流依赖头文件 <fstream>
  2. 三大类:ifstream(读)、ofstream(写)、fstream(读写)
  3. 打开文件必须判断是否成功
  4. 文本文件:直接用 <<>>
  5. 二进制文件:用 read()write()
  6. 文件定位:seekg / seekp
  7. 操作完毕必须 close()

掌握以上内容,即可完成 C++ 所有文件操作需求,包括配置文件、数据存储、日志记录等。

总结

  1. 文件流 分为读、写、读写三类,使用 <fstream> 头文件
  2. 打开模式 决定文件操作方式,app 追加、binary 二进制
  3. 文本文件 读写简单直观,二进制文件效率高、适合结构化数据
  4. 文件指针可实现随机读写,灵活定位任意位置
  5. 文件操作必须:打开 → 判断 → 读写 → 关闭
相关推荐
咸鱼翻身小阿橙2 小时前
Qt页面小项目
开发语言·qt·计算机视觉
C++ 老炮儿的技术栈2 小时前
工业视觉检测:用 C++ 和 Snap7 库快速读写西门子 S7-1200
c语言·c++·git·qt·系统架构·visual studio·snap
橙子也要努力变强2 小时前
信号捕捉的底层机制-内核态和用户态初识
linux·服务器·c++
knight_9___2 小时前
RAG面试题4
开发语言·人工智能·python·面试·agent·rag
澈2072 小时前
内存四区模型详解(栈、堆、全局、常量)
c++·面试·职场和发展
编程之升级打怪2 小时前
自定义实现Java的HashMap集合
java·开发语言
橙子也要努力变强2 小时前
信号捕捉底层机制-进程与OS
linux·服务器·c++
青瓦梦滋2 小时前
Linux线程
linux·运维·c++
Ulyanov2 小时前
《玩转QT Designer Studio:从设计到实战》 QT Designer Studio状态机深度应用:智能待办事项管理系统
开发语言·python·qt·gui·雷达电子对抗系统仿真