C語(yǔ)言實(shí)現(xiàn)最簡(jiǎn)單的2048存檔讀檔功能(獲取當(dāng)前路徑和文件IO)
簡(jiǎn)介
最近大一的學(xué)弟開始布置C語(yǔ)言的大作業(yè)了,于是在此提供一種比較簡(jiǎn)單的2048存檔讀檔功能的實(shí)現(xiàn)
1 獲取當(dāng)前目錄及存檔文件
記得自己大一的時(shí)候在這里研究了很久,在這里提供C語(yǔ)言的實(shí)現(xiàn)思路
首先是用到的函數(shù)介紹:
getcwd()
按住Ctrl后點(diǎn)擊getcwd可以知道getcwd接受兩個(gè)變量:一個(gè)char*,用于以字符串形式保存絕對(duì)地,另一個(gè)變量是第一個(gè)變量字符串的大小,以防止出現(xiàn)路徑長(zhǎng)度大于字符串長(zhǎng)度的情況。返回值就是當(dāng)前路徑的字符串形式。以下是常見(jiàn)用法的demo
對(duì)于這種用法有一個(gè)顯而易見(jiàn)的問(wèn)題:我們無(wú)法判斷當(dāng)前路徑的長(zhǎng)度,因此只能盡可能開大這個(gè)字符串的空間。但是另一方面,開過(guò)大的字符串難免會(huì)造成內(nèi)存空間的浪費(fèi)。
還記得之前說(shuō)的getcwd的返回值是字符串首地址嗎?在getcwd函數(shù)運(yùn)行過(guò)程中,函數(shù)會(huì)自動(dòng)申請(qǐng)空間來(lái)儲(chǔ)存這個(gè)字符串。因此我們可以不給字符串申請(qǐng)空間來(lái)使getcwd自動(dòng)申請(qǐng)內(nèi)存空間,并將返回值首地址賦給用于儲(chǔ)存的char*。樣例如下:
fopen()
在獲取到當(dāng)前路徑后,我們就可以用fopen函數(shù)打開存檔文件,在此之前先復(fù)習(xí)下fopen的基本用法
fopen接受兩個(gè)char*變量,第一個(gè)記錄文件的路徑,第二個(gè)表示文件的讀取模式,返回值為File*(文件指針)
對(duì)于第一個(gè)變量,我們需要傳入完整的文件路徑,這就需要我們將文件名和路徑兩個(gè)字符串拼接在一起(不會(huì)的自行復(fù)習(xí)strcat()函數(shù))
獲取到文件名之后,按照f(shuō)open的訪問(wèn)規(guī)則打開文件即可,常用的訪問(wèn)規(guī)則有:
對(duì)我們要實(shí)現(xiàn)的功能進(jìn)行分析,讀檔自然是使用"r+"
模式,讀取已有的存檔,如不存在返回失敗。
對(duì)于存檔,覆蓋已有存檔或保存新存檔,則使用"w+"
模式
綜上所述,對(duì)于存檔打開過(guò)程,可以寫出如下代碼:
存檔格式
在討論存檔格式前,我們先參考下常見(jiàn)ACM題目對(duì)于圖論題存圖的用例形式

由此可知,我們可以使用鄰接矩陣的方式,在文件和內(nèi)存之間相互轉(zhuǎn)化
設(shè)計(jì)文件格式如下:
第一行,給出一個(gè)整數(shù)?n
,表示方陣的邊長(zhǎng)(如不是方陣則設(shè)為?n m?
兩個(gè)整數(shù)分別表示長(zhǎng)和寬)
以下?n?
行,每行給出?n?
個(gè)整數(shù),表示當(dāng)前位置的值
文件流的輸入輸出:fscanf()和fprintf()
由函數(shù)名就不難看出,這兩個(gè)函數(shù)與scanf()
和printf()
非常相似,事實(shí)上這兩個(gè)函數(shù)在使用上只要在傳參的最前面加上FILE* fp
即可
例如從fp
指向的文件讀入一個(gè)整數(shù)到n
:
再例如向fp
指向的文件輸出一個(gè)整數(shù)n
:
綜上我們可以寫出完整的存檔讀檔代碼如下:
測(cè)試讀檔功能:

測(cè)試存檔功能:
