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;
}
相关推荐
qq_1998868712 小时前
第6板块·第4节:构建系统与多文件项目
c++·人工智能·gpu算力
汉克老师14 小时前
GESP2026年9月认证C++三级( 第三部分编程题(2、分割字符串))精讲
c++·gesp·小学生·学c++编程
估值探索者14 小时前
【Python量化系统工程化 #08】关了 SSH 就停?systemd 让脚本开机自启 + 异常自动拉起
java·c++·人工智能·分类·数据挖掘
天若有情67314 小时前
C++花式魔改!手写头文件复刻Java语法,彻底打破编码思维定式
java·c++·语言做语言·jac++
qq_1998868715 小时前
第7板块·第3节:CUTLASS 的 GEMM 实现与优化策略
c++·人工智能·gpu算力·cuda
hetao173383715 小时前
2026-09-17 hetao1733837 的刷题记录
c++·算法
shada16 小时前
Boost.Process v2 在旧内核上报 `assign: Bad file descriptor`
c++
别动我齐刘海16 小时前
ROS2 Jazzy + C++ 实战路线——基础学习2
c++·人工智能·vscode·python·学习·机器学习·机器人
free-elcmacom17 小时前
C语言指针进阶——指针数组模拟二维数组,以及二级指针到底怎么理解
c语言·visual studio code
朝朝辞暮i17 小时前
C++第 2 课
c++