資料合集下載鏈接:
?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 **?
?),我們先確定需要多少個隔層(指針數組),然后再把每一本書(字符串)放到對應的隔層上,每本書占用的空間都恰到好處。