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;
}
相关推荐
用户805533698031 小时前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
BadBadBad__AK14 小时前
线段树维护区间 k 次方和
c++·数学·算法·stl
卷无止境1 天前
Eigen 库如何借助 OpenMP 加速计算
c++·后端
卷无止境1 天前
OpenMPI、MPICH 与 OpenMP:关系、核心概念与架构全解
c++·后端
郝学胜_神的一滴2 天前
CMake 30:循环语法全解|foreach_while双循环精讲、迭代技巧与实战避坑指南
c++·cmake
卷无止境4 天前
C++ 的Eigen 库全解析
c++
卷无止境4 天前
现代 C++特性大盘点:一门脱胎换骨的老语言
c++·后端
郝学胜_神的一滴4 天前
CMake 27:缓存变量的特性、语法、类型与实操全解
c++·cmake
博客18006 天前
酷宝的使用方法,超好用的免费界面库,C++、MFC可用
c++·mfc·界面库·库来帮·酷宝
郝学胜_神的一滴6 天前
CMake 026:属性体系精讲、四大作用域全解 & 实战代码落地
c++·cmake