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;
}
相关推荐
小糯米6011 小时前
C语言 动态内存管理
c语言·开发语言
liulilittle1 小时前
拥塞控制:公平性的不可能三角
网络·c++·网络协议·tcp/ip·计算机网络·tcp·通信
小糯米6012 小时前
C语言 自定义类型:联合和枚举
java·c语言·开发语言
姚愚谦3 小时前
C++中的push_back与emplace_back的区别?
c++
青春:一叶知秋4 小时前
【C++】protobuf序列化与反序列化
开发语言·c++
Zhang~Ling6 小时前
C++ 红黑树封装:myset和mymap的底层实现
开发语言·数据结构·c++·算法
啦啦啦啦啦zzzz6 小时前
数据结构:堆排序
数据结构·c++·
原来是猿6 小时前
为什么 C++ 需要区分左值和右值?
开发语言·c++
珊瑚里的鱼6 小时前
C++的强制类型转换
android·开发语言·c++