当前位置: 首页 > news >正文

cpp自学 day20(文件操作)

 基本概念

程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放

通过文件可以将数据持久化

C++中对文件操作需要包含头文件 <fstream>

文件类型分为两种:

  • 文本文件 - 文件以文本的ASCII码形式存储在计算机中
  • 二进制文件 - 文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们

操作文件的三大类:

        1. ofstream:写操作

        2. ifstream:读操作

        3. fstream:读写操作

#include <fstream>  // 必须包含的头文件
数据特性说明
程序运行时数据临时数据,程序结束即释放
文件持久化数据长期存储在磁盘中

文件打开模式

模式标志功能描述
ios::in为读取打开文件
ios::out为写入打开文件
ios::ate初始定位到文件末尾
ios::app追加写入模式
ios::trunc存在则清空重建
ios::binary二进制模式操作

文本文件

写文件

void test01() {
    // 1. 包含头文件(已在全局包含)
    
    // 2. 创建输出流对象
    ofstream ofs;

    // 3. 指定打开方式(组合模式用 | 连接)
    ofs.open("test.txt", ios::out | ios::trunc);

    // 4. 写入格式化数据
    ofs << "姓名:张三" << endl;  // 正确使用<<运算符
    ofs << "性别:男" << endl;
    ofs << "年龄:18" << endl;

    // 5. 关闭文件流
    ofs.close();
}

读文件

基础操作框架

#include <fstream>  // 必须包含的头文件
#include <string>   // 字符串操作支持

void readFileDemo() {
    // 1. 创建流对象
    ifstream ifs;
    
    // 2. 打开文件并验证
    ifs.open("test.txt", ios::in);  // ios::in表示读取模式
    if (!ifs.is_open()) {           // 必须检查打开状态
        cerr << "文件打开失败" << endl;
        return;
    }
    
    // 3. 读取数据(四种方式见下文)
    
    // 4. 关闭文件流
    ifs.close();
}

四种读取方式对比

方式1:运算符重载读取
char buf[1024] = {0};  // 1024为缓冲区长度
while (ifs >> buf) {   // 自动处理空格/换行分隔
    cout << buf << endl;
}

特点:

  • 自动按空白符分割内容
  • 缓冲区需预分配固定大小
  • 适合结构化数据读取
方式2:getline成员函数
char buf[1024] = {0};
while (ifs.getline(buf, sizeof(buf))) {  // 流对象的成员函数
    cout << buf << endl;  // 自动处理换行符
}

特点:

  • 精确控制缓冲区大小
  • 自动去除换行符
  • 需注意缓冲区溢出风险
方式3:全局getline函数
string buf;
while (getline(ifs, buf)) {  // 使用string自动管理内存
    cout << buf << endl;     // 无长度限制
}

特点:

  • 自动管理内存
  • 无需担心缓冲区溢出
  • 标准推荐方式
方式4:逐字符读取
char c;
while ((c = ifs.get()) != EOF) {  // EOF检测
    cout << c;  // 原样输出所有字符
}

特点:

  • 完全控制读取过程
  • 适合二进制文件处理
  • 性能开销较大

二进制文件

核心操作框架

#include <fstream>
#include <string>

// 示例数据结构
struct PlayerData {
    int id;         // 4字节
    double score;   // 8字节
    char name[32];  // 32字节
}; // 总大小:44字节

void binaryDemo() {
    // 创建流对象
    fstream file("game.dat", ios::binary | ios::out | ios::in);
    
    // 验证文件状态
    if (!file.is_open()) {
        cerr << "文件打开失败" << endl;
        return;
    }
    
    // 读写操作(见下文示例)
    
    file.close();
}

读写文件

// 读取基本类型
int loadedScore;
file.read(reinterpret_cast<char*>(&loadedScore), sizeof(int));

// 读取结构体(需内存对齐)
#pragma pack(push, 1)  // 1字节对齐
struct PackedData {
    short type;
    bool valid;
    // ...
};
#pragma pack(pop)

PackedData data;
file.read(reinterpret_cast<char*>(&data), sizeof(PackedData));

// 批量读取
vector<PlayerData> players(10);
file.read(reinterpret_cast<char*>(players.data()), 
         players.size() * sizeof(PlayerData));

相关文章:

  • 关于sqlsugar实体多层List映射的问题
  • 第十五届蓝桥杯大赛软件赛省赛Python 大学 C 组题目试做(中)【本期题目:回文数组,挖矿】
  • CmLicense授权损耗规避措施
  • spring boot 实现spring mvc过程中WebMvcConfigurer接口及其相关实现类的详细对比
  • Redis 的五种数据类型面试回答
  • 安全编码课程 实验6 整数安全
  • WPF依赖注入
  • 【金仓数据库】
  • 深入解析 MySQL 中的日期时间函数:DATE_FORMAT 与时间查询优化
  • HTTP 响应头 Strict-Transport-Security 缺失漏洞
  • GraphRAG与知识图谱
  • 【数据标准】数据标准化实施流程与方法-保障机制篇
  • 图灵逆向——题一-动态数据采集
  • createContext+useContext+useReducer组合管理React复杂状态
  • 代码片段 - C#实现多张图片根据重叠部分拼接图像
  • SpringBoot的简单介绍
  • Vue3实战八、路由权限和动态路由
  • 使用 Lua 脚本高效查询 Redis 键的内存占用
  • 【go】slice的浅拷贝和深拷贝
  • Python设计模式:适配模式
  • 上海公司注册代理公司/杭州网站seo价格
  • 乐清网站建设honmau/培训学校机构有哪些
  • 吃的网站要怎么做/如何找做网站的公司
  • 科技有限公司网站建设策划书/网站建设企业
  • 外包客服平台/满足seo需求的网站
  • wordpress企业站教程/百度推广账户登录