资料合集下载链接:
https://pan.quark.cn/s/472bbdfcd014
在上一篇文章中,我们探讨了二级指针作为函数“输出特性”的强大功能。今天,我们将更进一步,通过一个完整的实战项目,将二级指针与文件I/O操作结合起来,学习如何动态、高效地读取和管理文件内容。
这个项目非常经典,它能帮你解决一个常见问题:如何读取一个行数未知、每行长度也未知的文本文件,并将其内容优雅地存储在内存中?
答案,就在于 char **
——指向指针的指针。
一、 项目需求与整体思路
我们的目标是:
- 1. 创建一个文本文件(例如
data.txt
),并在其中写入若干行字符串。 - 2. 编写一个C程序,该程序能:
- • 自动获取文件中的总行数。
- • 动态分配一个指针数组(
char **
),其大小与文件行数相同。 - • 逐行读取文件,并为每一行字符串动态分配恰好足够的内存。
- • 将所有字符串打印到控制台。
- • 在程序结束前,干净、彻底地释放所有动态分配的内存。
核心思路:两步走内存分配
直接用一个巨大的二维数组 char data[100][100]
?这太浪费空间了!如果文件只有3行,每行5个字符,那绝大部分内存都被闲置了。
正确的做法是使用二级指针 char **p_data
,进行两级精细化的内存分配:
- 1. 分配指针数组:首先,我们分配一个能存放
char *
指针的数组。这个数组的大小就是文件的行数。p_data
就指向这个数组的开头。 - 2. 分配各行字符串内存:然后,我们遍历这个指针数组,对于每个指针
p_data[i]
,我们根据文件中第 i
行的实际长度,为其分配独立的内存空间,用于存放该行的字符串。
这种方式就像一个书架(char **
),我们先确定需要多少个隔层(指针数组),然后再把每一本书(字符串)放到对应的隔层上,每本书占用的空间都恰到好处。