C语言进阶完结篇笔记10:格式化文件IO、Makefile、位运算、线性表实战
本文全面讲解C语言高级标准I/O(fscanf/fprintf/sscanf/sprintf)、文件随机访问、Makefile工程化构建、位运算与位段底层原理,并深入数据结构部分,实现动态顺序表与单向链表完整代码,包含头插、尾插、删除、扩容、快慢指针等核心操作,配套可运行工程化案例,适合C语言进阶、期末复习与面试突击。
前言
本篇是C语言进阶与数据结构入门的核心内容,覆盖标准文件格式化IO、文件随机定位、Makefile自动化构建、位运算/位段、动态顺序表、单向链表六大模块。从文件操作到工程管理,从底层二进制到线性表结构,形成完整的C语言高阶知识体系,所有案例均为工程化可直接运行代码。
一、标准I/O 高级格式化函数
1.1 fscanf / fprintf(文件 ↔ 程序)
fprintf(写入文件)
#include<stdio.h>intmain(){FILE*fp=fopen("output.txt","w");intid=1001;charname[]="ZhangSan";floatscore=92.5;fprintf(fp,"学号:%d\n姓名:%s\n成绩:%.1f\n",id,name,score);fclose(fp);return0;}fscanf(读取文件)
#include<stdio.h>intmain(){FILE*fp=fopen("data.txt","r");charname[20];intage;floatscore;fscanf(fp,"%s %d %f",name,&age,&score);printf("%s %d %.1f\n",name,age,score);fclose(fp);return0;}区别:
- fscanf:传地址,必须加 &
- fprintf:传变量本身,不用 &
1.2 sscanf / sprintf(字符串 ↔ 程序)
sscanf(字符串解析 → 变量)
#include<stdio.h>intmain(){charinfo[]="Alice 19 95.5";charname[20];intage;floatscore;sscanf(info,"%s %d %f",name,&age,&score);return0;}sprintf(变量拼接 → 字符串)
#include<stdio.h>intmain(){charresult[100];charname[]="Alice";intage=19;sprintf(result,"姓名:%s 年龄:%d",name,age);printf("%s\n",result);return0;}1.3 四函数对比总结
| 函数 | 数据流向 | 典型场景 |
|---|---|---|
| fscanf | 文件 → 程序 | 读取配置、日志 |
| fprintf | 程序 → 文件 | 写日志、导出数据 |
| sscanf | 字符串 → 程序 | 解析文本、拆分字段 |
| sprintf | 程序 → 字符串 | 拼接路径、数字转字符串 |
二、文件随机访问
2.1 核心函数
rewind(fp):回到文件开头ftell(fp):获取当前指针偏移fseek(fp, offset, whence):定位到任意位置SEEK_SET:文件开头SEEK_CUR:当前位置SEEK_END:文件末尾
2.2 计算文件大小
fseek(fp,0,SEEK_END);longsize=ftell(fp);rewind(fp);2.3 随机读写结构体
typedefstruct{intid;charname[20];}Stu;// 写入fwrite(&stu,sizeof(Stu),1,fp);// 定位并读取fseek(fp,1*sizeof(Stu),SEEK_SET);fread(&stu,sizeof(Stu),1,fp);三、Makefile 工程化管理
3.1 基础语法
目标: 依赖 <TAB>命令3.2 自动变量
$@:目标名$^:所有依赖$<:第一个依赖$(VAR):使用变量
3.3 完整通用 Makefile
CC := gcc CFLAGS := -Wall -g TARGET := app SRCS := $(wildcard *.c) OBJS := $(patsubst %.c, %.o, $(SRCS)) .PHONY: all clean run all: $(TARGET) $(TARGET): $(OBJS) $(CC) $^ -o $@ %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ clean: rm -f $(OBJS) $(TARGET) run: $(TARGET) ./$(TARGET)3.4 常用命令
make# 编译makeclean# 清理makerun# 编译并运行四、位运算进阶与位段
4.1 位运算赋值符
a &= mask清零指定位a |= mask设为1a ^= mask翻转a <<= n左移a >>= n右移
4.2 八大经典场景
- 清零指定位:
a &= ~(1 << n) - 获取某一位:
(a >> n) & 1 - 设置某一位:
a |= (1 << n) - 翻转某一位:
a ^= (1 << n) - 无中间变量交换:
a^=b; b^=a; a^=b; - 判断奇偶:
a & 1 - 快速乘除2:
<</>> - 统计1的个数:
while(a) {a &= a-1; count++;}
4.3 位段(位域)
structPWR{unsignedintldps:1;unsignedintpdds:1;unsignedintpls:3;};- 按bit分配内存
- 不能取地址
- 常用于寄存器、协议解析
五、数据结构:动态顺序表(完整实现)
5.1 结构体定义
typedefstruct{int*data;intcapacity;intlast;}ArrayList;5.2 核心接口
- 初始化:
array_list_init - 头插:
array_list_insert_head - 判断满/空:
array_list_is_full/is_empty - 扩容:2倍扩容
realloc - 删除:
array_list_remove - 销毁:
array_list_destroy
5.3 特点
- 连续内存、支持随机访问
- 插入删除需要移动元素,O(n)
- 访问快,增删慢
六、数据结构:单向链表(完整实现)
6.1 节点结构体
typedefstructSingleListNode{ListData data;structSingleListNode*next;}ListNode;6.2 核心操作
- 创建头节点
- 头插法、尾插法
- 指定位置插入
- 快慢指针(找倒数第k个)
6.3 快慢指针示例
ListNode*find_reverse_k(ListNode*head,intk){ListNode*fast=head,*slow=head;for(inti=0;i<k;i++){if(!fast)returnNULL;fast=fast->next;}while(fast){fast=fast->next;slow=slow->next;}returnslow;}6.4 特点
- 不连续内存,无容量限制
- 插入删除O(1)(已知位置)
- 不支持随机访问,遍历O(n)
小结
- 标准I/O:掌握四组格式化函数,可完成配置读写、数据持久化。
- 文件随机访问:fseek/ftell 实现大文件高效操作。
- Makefile:自动化编译,多文件项目必备。
- 位运算:底层操作、嵌入式、算法优化核心技能。
- 顺序表:连续存储、随机访问、适合查询。
- 单链表:离散存储、插入删除高效、适合频繁修改。
至此,C语言从基础语法、指针、内存、构造类型、预处理、库、IO到数据结构入门全部完成。
