当前位置: 首页 > news >正文

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设为1
  • a ^= mask翻转
  • a <<= n左移
  • a >>= n右移

4.2 八大经典场景

  1. 清零指定位a &= ~(1 << n)
  2. 获取某一位(a >> n) & 1
  3. 设置某一位a |= (1 << n)
  4. 翻转某一位a ^= (1 << n)
  5. 无中间变量交换a^=b; b^=a; a^=b;
  6. 判断奇偶a & 1
  7. 快速乘除2<</>>
  8. 统计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)

小结

  1. 标准I/O:掌握四组格式化函数,可完成配置读写、数据持久化。
  2. 文件随机访问:fseek/ftell 实现大文件高效操作。
  3. Makefile:自动化编译,多文件项目必备。
  4. 位运算:底层操作、嵌入式、算法优化核心技能。
  5. 顺序表:连续存储、随机访问、适合查询。
  6. 单链表:离散存储、插入删除高效、适合频繁修改。

至此,C语言从基础语法、指针、内存、构造类型、预处理、库、IO到数据结构入门全部完成。

http://www.jsqmd.com/news/638901/

相关文章:

  • 2026洁净衣柜厂家推荐 苏州灵秀净化科技产能与专利双领先 - 爱采购寻源宝典
  • 【仅限头部AI基建团队内部流出】AIAgent架构版本兼容性决策树:5维评估模型+动态降级SOP
  • Linux CentOS7 修改计算名为 localhost,[ygb@MiWiFi-R3-srv ~]$改为[ygb@localhost ~]$
  • Linux I2C设备驱动框架解析与MPU6050移植实践
  • 阿里最新开源!Z-Image-ComfyUI快速体验:中文提示词也能精准出图
  • 终极指南:如何使用SMUDebugTool深度调试AMD Ryzen系统硬件参数
  • 3分钟快速上手:WechatDecrypt微信聊天记录解密完全指南
  • 8大网盘直链解析工具:跨平台下载效率提升解决方案
  • 深聊南昌紧邻高速路口的厂房,推荐哪里价格合理 - myqiye
  • AcousticSense AI应用案例:如何用AI工具为视频快速匹配背景音乐风格
  • 搞懂PMOS/NMOS布局:一个反相器版图里的电源/地线(VDD/VSS)连接门道
  • 沃尔玛购物卡怎么快速回收?小白也能轻松操作! - 团团收购物卡回收
  • 艾尔登法环帧率解锁终极指南:告别60帧限制,体验144Hz流畅战斗
  • PADS开发实战:从安装到破解的完整指南
  • 2026年离子风扇采购指南:苏州专业源头厂家实力大起底
  • 大模型在政务领域的轻量化部署与适配方案
  • ChatGLM3-6B多轮对话实战:如何实现连续追问不遗忘
  • 知识图谱双轨制:通用与行业图谱的融合应用全景
  • 领域驱动设计管理化技术聚合根与仓储
  • Windows Defender Remover:彻底解决Windows Defender性能问题的完整指南
  • 2026桶装水设备厂家推荐排行榜产能、专利、服务三维度权威对比 - 爱采购寻源宝典
  • 别再死记硬背四元数公式了!用Hamilton约定搞定IMU姿态更新(ROS/Eigen/Ceres都这么用)
  • E-Hentai漫画批量下载:开源工具的高效解决方案
  • 别再只写TextView了!Android桌面小组件开发避坑指南:从布局限制到AppWidgetProvider实战
  • 【内核前沿】从 veth 到 netkit:深度解析 TCP devmem 穿透容器屏障的“队列租赁”黑科技
  • ArcGIS实战:从扫描地图到智能矢量数据的完整工作流
  • 兰州大学计算机考研:从‘双非’逆袭到一志愿保护,25届最新数据与避坑指南
  • 领域特定语言:内部DSL与外部DSL的实现方式
  • 告别串口线!用Arduino IDE和巴法云,5分钟搞定ESP8266无线OTA升级
  • 小白也能玩转语音识别:Qwen3-ASR-1.7B开箱即用,实测效果惊艳