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;
}
相关推荐
老王爱玩车4 小时前
动态内存管理
c语言·开发语言·学习·面试
Logic1015 小时前
C语言/数据结构数位DP题解:平滑排列数字统计——区间内相邻位差不超过K的数字个数
c语言·数据结构·动态规划·时间复杂度·数位dp·算法题·前导零处理
程序员老陆5 小时前
C++ 多线程通信方式全景:从共享内存到结构化协调
开发语言·c++
Zwawa5 小时前
把 AO 接回来:黑线和白底之间到底差了多少
c语言·单片机·嵌入式
某不知名網友5 小时前
ROS2 核心通信:话题发布与订阅详解
开发语言·c++
C++ 老炮儿的技术栈5 小时前
char (*csConnectName)[256]; 和 char csConnectName [256] 有什么区别
java·c语言·开发语言·c++·人工智能·算法·c
大鹏说大话5 小时前
C++ STL 容器怎么选?vector、list、map、unordered_map 对比
开发语言·c++·list
JMchen6 小时前
性能优化——让Native代码飞起来
android·c++·性能优化
chenbingjie_c6 小时前
手撕 C++ priority_queue:二叉堆 + 模板仿函数 + 模板特化(保姆级逐函数拆解)
开发语言·c++
小小龙学IT6 小时前
C++ Redis 客户端深度解析(hiredis 与 redis-plus-plus)——工业数采实时缓存 C++ 侧实战
c++·redis·缓存