C語(yǔ)言主要通過(guò)編寫(xiě)代碼、編譯等方式實(shí)現(xiàn)運(yùn)行,對(duì)于習(xí)慣使用Windows操作系統(tǒng)并通過(guò)雙擊鼠標(biāo)等方式操作文件的學(xué)習(xí)者來(lái)說(shuō),使用編程技術(shù)處理文件顯得較為難以入手,本文主要介紹C語(yǔ)言處理文件的幾個(gè)關(guān)鍵技術(shù),通過(guò)編寫(xiě)代碼實(shí)現(xiàn)操作文件的目標(biāo),為學(xué)習(xí)者使用C語(yǔ)言代碼操作文件方式方法提供借鑒,促進(jìn)編程應(yīng)用技術(shù)水平的提升。
【關(guān)鍵詞】C語(yǔ)言 代碼 文件 技術(shù)
本文以文本文件(.txt)為例,具體為:c:\file.txt,將通過(guò)介紹關(guān)聯(lián)文件、打開(kāi)關(guān)閉、讀寫(xiě)數(shù)據(jù)等C語(yǔ)言操作文件的關(guān)鍵技術(shù)讓C語(yǔ)言學(xué)習(xí)者充分掌握對(duì)文件的基本操作。
1 使用結(jié)構(gòu)體指針變量關(guān)聯(lián)文件技術(shù)
要善于利用C語(yǔ)言中的庫(kù)函數(shù)讀寫(xiě)文件,使用庫(kù)函數(shù)定義好的結(jié)構(gòu)類型FILE管理對(duì)象文件的各種信息。
1.1 了解C語(yǔ)言操作文件方式
圖1是C語(yǔ)言操作文件方式圖,要實(shí)現(xiàn)C語(yǔ)言成功操作到磁盤(pán)里面的文件,必須通過(guò)文件名、使用方式和文件類型指針,也是我們用C語(yǔ)言操作文件的最主要實(shí)參。
1.2 了解結(jié)構(gòu)體FILE
在很多的C語(yǔ)言程序設(shè)計(jì)的教材中都提到讓學(xué)習(xí)者不必關(guān)心結(jié)構(gòu)體FILE內(nèi)部的細(xì)節(jié),只需要直接使用即可,但要學(xué)到位,達(dá)到真正領(lǐng)會(huì)并實(shí)現(xiàn)應(yīng)用的水平,了解FILE內(nèi)部詳細(xì)內(nèi)容很有必要,該結(jié)構(gòu)體定義在stdio.h頭文件中,代碼內(nèi)容如下:
Typedef struct {
char *_ptr; //文件輸入的下一個(gè)位置
int _cnt; //當(dāng)前緩沖區(qū)的相對(duì)位置
char*_base; //指文件的起始位置
int _flag; //文件標(biāo)志
int _file; //文件的有效性驗(yàn)證
int _charbuf; //檢查緩沖區(qū)狀況,如果無(wú)緩沖區(qū)則不讀取
char *_tmpfname; //臨時(shí)文件名
int _fd;//文件號(hào)
int _cleft;//緩沖區(qū)中剩下的字符數(shù)
int _mode;//文件的操作方式
char *_next;//文件當(dāng)前讀寫(xiě)位置
chanr *_buff;//文件緩沖區(qū)位置
}; FILE;
其中文件號(hào)、操作方式、文件當(dāng)前位置是文件結(jié)構(gòu)體中最為核心內(nèi)容,理解結(jié)構(gòu)體中的具體內(nèi)容有助于如何更好地靈活讀寫(xiě)文件。
1.3 定義文件指針
要操作一個(gè)文件,必須明確該文件在磁盤(pán)中的具體位置和文件名,實(shí)際是要確定文件所在磁盤(pán)物理地址,定義好文件指針,為之后正常讀寫(xiě)文件打下基礎(chǔ),具體在代碼中的表達(dá)方式為:“FILE *wj;”。其中“wj”是類型為FILE的文件指針變量,“*”一定不能省略,以后就用“wj”來(lái)代替文件的具體路徑和具體文件,也就是說(shuō)“wj”就是文件的具體代號(hào),包括文件的具體路徑、文件名等都由它了全權(quán)代表。
1.4 調(diào)用庫(kù)函數(shù)關(guān)聯(lián)文件
調(diào)用庫(kù)函數(shù)fopen,實(shí)現(xiàn)將文件指針wj與要操作的具體文件建立關(guān)聯(lián),具體實(shí)現(xiàn)代碼為:wj=fopen(“c:\\file.txt”,“r”);其中fopen函數(shù)需要兩個(gè)參數(shù),第一個(gè)參數(shù)是包含有具體路徑的文件名,第二個(gè)參數(shù)“r”是表示打開(kāi)文件方式,這里表示是只讀取內(nèi)容。
Fopen函數(shù)的返回值是一個(gè)FILE類型的地址,wj與文件關(guān)聯(lián),實(shí)際就是將fopen返回的這個(gè)地址保存到指針變量wj中,但不只是地址,還有其他相關(guān)文件的重要信息,這也是為什么使用結(jié)構(gòu)體的緣故。
2 調(diào)用庫(kù)函數(shù)打開(kāi)和關(guān)閉文件技術(shù)
通過(guò)fopen庫(kù)函數(shù)把C語(yǔ)言與磁盤(pán)中的文件進(jìn)行了關(guān)聯(lián),接下來(lái)就可以進(jìn)行后續(xù)的讀寫(xiě)操作。
2.1 文件的打開(kāi)
首先要對(duì)文件的打開(kāi)成功與否進(jìn)行判斷,只有文件打開(kāi)成功才能進(jìn)行后續(xù)的讀寫(xiě)操作,若打開(kāi)失敗應(yīng)給出一些提示,不能再讀寫(xiě)文件,這是很有必要的,可能會(huì)存在由于磁盤(pán)已滿、文件損壞、文件夾不存在等原因而導(dǎo)致打開(kāi)文件失敗。在系統(tǒng)中,文件打開(kāi)失敗時(shí)fopen的返回值是0或NULL(即返回空指針),如文件打開(kāi)成功,fopen的返回值為非0,可以通過(guò)以下代碼實(shí)現(xiàn):
FILE *wj;
Wj=fopen(“c:\\file.txt”,“r”);
If(wj==NULL)
Printf(“文件打開(kāi)失敗!”);
Else
/*讀寫(xiě)文件*/
把文件指針wj與具體文件file.txt關(guān)聯(lián)起來(lái),如果fopen函數(shù)的返回值為非0,就可以判斷該文件已成功被打開(kāi)。
2.2 文件的關(guān)閉
文件指針與文件關(guān)聯(lián),是為了指針代表文件,以便后續(xù)的讀寫(xiě)操作,需要占用系統(tǒng)資源,不能長(zhǎng)期占用,否則可能導(dǎo)致文件信息丟失等情況,因此在程序運(yùn)行結(jié)束之前,必須讓指針和文件解除關(guān)系以釋放系統(tǒng)資源,這個(gè)過(guò)程稱為關(guān)閉文件,C語(yǔ)言通過(guò)使用fclose庫(kù)函數(shù)實(shí)現(xiàn)文件的關(guān)閉,具體代碼為:“fclose(wj);”參數(shù)是文件指針變量名。
解除關(guān)聯(lián)后,文件指針wj不再代表文件file.txt,不能再通過(guò)wj讀寫(xiě)該文件,在程序運(yùn)行過(guò)程中,隨時(shí)可以用fclose庫(kù)函數(shù)關(guān)閉文件,即解除指針與文件的關(guān)聯(lián)關(guān)系,此時(shí)可以使用wj關(guān)聯(lián)其他文件。
3 讀寫(xiě)文件數(shù)據(jù)信息技術(shù)
3.1 用庫(kù)函數(shù)fscanf讀取文件數(shù)據(jù)代碼
文件file.txt中有2列數(shù)據(jù),共5行,第1列為序號(hào)(int型),第2列為分?jǐn)?shù)(float型),讀取數(shù)據(jù)代碼如下:
#include
Main()
{FILE *wj;int a,b;float c;
Wj=fopen(“c:\\file.txt”,“r”);
For(a=1;a<6;a++)
{fscanf(wj,“%d %f”,&b,&c);}
Fclose(wj);}
通過(guò)編譯,界面會(huì)顯示file.txt中的數(shù)據(jù),共5行2列,第1列為序號(hào),第2列為分?jǐn)?shù)。
3.2 用庫(kù)函數(shù)fprintf寫(xiě)入文件信息代碼
#include
Main()
{FILE *wj;
Wj=fopen(“c:\\file.txt”,“w”);
Fprintf(wj,“good!”);
Fclose(wj);}
通過(guò)編譯,位于C盤(pán)下file.txt文件被寫(xiě)入“good!”文本。
通過(guò)以上內(nèi)容可以總結(jié)出C語(yǔ)言對(duì)文件操作流程為:定義文件指針變量、打開(kāi)文件、讀寫(xiě)文件和關(guān)閉文件,分別要用到結(jié)構(gòu)類型FILE、庫(kù)函數(shù)fopen和庫(kù)函數(shù)fclose,在讀寫(xiě)是還要使用到fscanf和fprintf庫(kù)函數(shù),為C語(yǔ)言學(xué)習(xí)者提供借鑒。
參考文獻(xiàn)
[1]百度百科.
[2]譚浩強(qiáng).C程序設(shè)計(jì)[M].北京清華大學(xué)出版社,1999.
[3]張蕾.基于項(xiàng)目化教學(xué)的“C語(yǔ)言程序設(shè)計(jì)”課程改革[J].教改縱橫,2013(02):17.
[4]肖捷.C語(yǔ)言程序設(shè)計(jì)實(shí)踐教學(xué)方案研究與設(shè)計(jì)[J].東莞理工學(xué)院學(xué)報(bào),2012.19(05).
作者簡(jiǎn)介
羅慧蘭(1981-),女,廣東省廣州市人。軟件工程碩士,講師。研究方向?yàn)橛?jì)算機(jī)軟件、計(jì)算機(jī)網(wǎng)絡(luò)、電子商務(wù)。
作者單位
廣東生態(tài)工程職業(yè)學(xué)院 廣東省廣州市 510520