C/C++ 基础笔记(九)联合、枚举及文件操作

本篇核心知识:联合(union)、枚举(enum)、文件操作(FILE、读写)


一、联合(union)

概念

联合是复合数据类型 ,多个成员共享同一块内存,同一时间只能用一个成员。

特性

  1. 定义格式:与结构体类似

    复制代码
    union 联合名 {
        类型1 成员1;
        类型2 成员2;
    };
  2. 内存特点:

    • 所有成员共用首地址,同一时间仅一个成员有效。

    • 总大小 = 最大成员的字节数(内存复用)。

  3. 初始化 :用{}初始化第一个成员

  4. 使用场景:节省内存、类型转换、多状态复用。

代码示例

复制代码
union Data {
    int num;
    char ch;
    float f;
};
​
int main() {
    Data d;
    d.num = 10;
    cout << d.num << endl; // 10
    d.ch = 'A';
    cout << d.ch << endl;  // A(num值被覆盖)
    return 0;
}

相似概念比较:联合 vs 结构体

  • 结构体:成员独立内存,总大小 = 各成员之和 + 对齐填充。

  • 联合:成员共享内存,总大小 = 最大成员大小。


二、枚举(enum)

概念

枚举是自定义常量集合,用名字表示固定整数,提高代码可读性。

特性

  1. 定义格式:

    复制代码
    enum 枚举名 {
        常量1,  // 默认从0开始
        常量2 = 6,
        常量3  // 自动+1,=7
    };
  2. 默认值 :首常量默认0,后续依次 +1;可手动指定值。

  3. 本质 :枚举常量是int 型常量,占 4 字节。

  4. 使用场景:状态标记、选项控制、游戏类型 / 角色状态。

代码示例

复制代码
// 定义怪物类型
enum MonsterType {
    SLIME,      // 0
    GOBLIN = 10,
    ORC,        // 11
    BOSS = 100
};
​
int main() {
    MonsterType m = SLIME;
    cout << m << endl; // 0
    m = BOSS;
    cout << m << endl; // 100
    return 0;
}

三、文件操作(C 语言)

概念

通过FILE类型指针,实现文件打开、读写、关闭,用于数据持久化。

特性

1. 核心要素
  • FILE*:文件指针,指向文件信息区。

  • 头文件:<stdio.h>

2. 文件打开(fopen/fopen_s)
  • 格式:FILE* fopen(文件名, 打开方式);

  • 常用方式:

    • "w"写模式,不存在则创建,存在则清空。

    • "r"读模式,不存在则失败。

    • "wb"/"rb":二进制读写(速度快、不可读)。

  • 安全版:VS 用fopen_s(&文件指针, 文件名, 方式);

3. 文件关闭(fclose)
  • 格式:int fclose(FILE*);

  • 作用:释放资源,必须操作

4. 文件写(fwrite)
  • 格式:size_t fwrite(数据地址, 单个大小, 个数, 文件指针);
5. 文件读(fread)
  • 格式:size_t fread(缓冲区地址, 单个大小, 个数, 文件指针);

代码示例

复制代码
#include <stdio.h>
​
int main() {
    FILE* fp = fopen("test.txt", "w");
    if (!fp) return 1;
​
    // 写数据
    char str[] = "hello";
    fwrite(str, sizeof(char), 5, fp);
    fclose(fp);
​
    // 读数据
    char buf[10] = {0};
    fp = fopen("test.txt", "r");
    fread(buf, sizeof(char), 5, fp);
    fclose(fp);
​
    printf("%s\n", buf); // hello
    return 0;
}
相关推荐
hold?fish:palm13 分钟前
7 接雨水
开发语言·c++·leetcode
郝学胜-神的一滴1 小时前
中级OpenGL教程 022:探秘三维世界的血脉传承——物体父子关系与矩阵递归奥义
c++·线性代数·unity·矩阵·游戏引擎·unreal engine·opengl
ch0sen1pm2 小时前
刚学完 CAS 原子操作,我花了一晚上写了三个无锁队列
c++
qeen872 小时前
【C++】vector的模拟实现详解(二)
c++·学习·算法·迭代器·stl
代码雕刻家2 小时前
编程语法细节
java·c语言·开发语言
j7~2 小时前
【C++】C++ 继承全解析:从基本语法到菱形继承的底层原理
开发语言·c++·继承·组合·虚继承·#暑假·七月创作之星博客挑战赛
数行拙笔2 小时前
C++客户端---String类型
开发语言·c++·bootstrap
草莓熊Lotso3 小时前
【Linux网络】深入理解Linux IO多路复用:从本质到select服务器实战
linux·运维·服务器·c语言·网络·数据库·c++
selfsongs14 小时前
指针、内存管理、现代 C++ 特性
c++
吃着火锅x唱着歌15 小时前
Effective C++ 学习笔记 条款37 绝不重新定义继承而来的缺省参数值
c++·笔记·学习