C語言指標的用法(C語言指標怎麼初始化)
檔案的定義
在使用電腦的時候,我們經常操作檔案。例如,我們可以新建一個.txt型別的文字檔案,在裡面存放資料。在Windows電腦下,進入一個資料夾,單擊右鍵,選擇“新建”---> “文字文件”,如下圖:
此時,我們新建一個.txt型別的文字檔案。我們可以設定該檔案的名稱是123.txt,如下圖:
然後,我們可以在該檔案中儲存資料。雙擊開啟123.txt文字檔案,然後,輸入需要儲存的資料,如下圖:
最後,單擊左上角的“檔案”---> “儲存”就可以儲存檔案的資料。該檔案儲存到硬碟上。例如,上面的例子,建立的123.txt檔案就儲存到G盤目錄下。儲存檔案之後。此時,在電腦上就新建了一個123.txt檔案,檔案裡存放“aaabbb”字串資訊。
此時,我們通過鍵盤和滑鼠,新建了一個文字檔案,並給檔案寫入資料。那麼,我們能否通過軟體來自動實現這個功能?
C語言提供了一系列的介面函式,用於操作檔案。可以新建一個檔案、讀寫檔案的資料。下面我們學習C語言對檔案的操作,並結合實際的例子,掌握這些檔案操作函式在實際專案中的應用。
2 檔案指標的分析
標準C語言提供了fopen(), fread(), fwrite(), fgets(), fputs(), fclose()等函式,用於操作一個檔案。假設有123.txt 檔案,我們把檔案的內容,讀取到記憶體中,有如下的操作流程:
(1) 呼叫fopen()開啟123.txt檔案;
(2) 呼叫fread()函式,從123.txt檔案讀取資料;
(3) 呼叫fclose()函式,關閉開啟的123.txt檔案;
那麼,在這個操作流程中,都圍繞著一個物件進行,就是fopen()函式返回的檔案指標物件。根據fopen()函式的定義如下:
FILE* fopen(const char *path, const char *mode);
該函式返回一個FILE*型別的指標變數,我們稱為:檔案指標。
例如,呼叫fopen()函式開啟123.txt檔案,如下:
FILE* fp = NULL; //定義檔案指標變數;
fp = fopen("123.txt", "r"); //開啟檔案,獲取返回的檔案指標;
呼叫fopen()函式開啟123.txt檔案成功之後,就返回一個FILE*型別的檔案指標,並賦值給檔案指標變數fp,那麼,檔案指標變數fp指向123.txt檔案。
然後,呼叫fread()函式從fp檔案指標讀取資料,就是從檔案指標fp指向的123.txt檔案讀取資料。
操作完之後,需要呼叫fclose()函式來關閉檔案指標fp。那麼,檔案指標fp就不再指向123.txt檔案。此時,再呼叫fread()、fwrite()函式來操作,都不會對123.txt檔案有任何影響。
所以,這一系列的檔案操作函式,都是圍繞FILE*型別的檔案指標進行。FILE結構體是標準C語言定義的一個型別,我們不用去理解該結構體的定義,只需要知道fopen(), fread(), fclose()等函式的應用,通過這些函式來實現對檔案的操作。
3 檔案的操作
對檔案的操作,必須呼叫fopen()函式開啟檔案,得到一個FILE*型別的檔案指標,然後,呼叫fread()、fwrite()等函式對檔案進行讀寫操作。操作完之後,需要呼叫fclose()函式關閉開啟的檔案。
所以,呼叫fopen()函式開啟檔案,最後,呼叫fclose()函式關閉檔案。
3.1 開啟檔案讀取資料
C語言提供了fopen()函式,用於開啟一個檔案,函式定義如下:
FILE* fopen(const char *path, const char *mode);
函式說明:開啟 path 引數指向的檔案。mode引數是檔案開啟的模式。根據該模式,以不同的方式開啟檔案。
返回值:成功返回指向開啟檔案的檔案指標,否則,返回NULL。
引數mode有不同的組合,可以對開啟的檔案進行不同的操作。該引數的取值如下:
"r" --- 開啟一個用於讀取的文字檔案
"w" --- 建立一個用於寫入的文字檔案
"a" --- 附加(追加寫入資料)到一個文字檔案
"rb" --- 開啟一個用於讀取的二進位制檔案,字母b是binary表示二進位制資料流英文的首字母。
"wb" --- 建立一個用於寫入的二進位制檔案
"ab" --- 附加(追加寫入資料)到一個二進位制檔案
"r " --- 開啟一個用於讀/寫的文字檔案
"w " --- 建立一個用於讀/寫的文字檔案
"a " --- 開啟一個用於讀/寫的文字檔案
"rt" --- 只讀開啟一個文字檔案,只允許讀資料
"wt" --- t(text): 文字檔案,可省略不寫,只寫方式開啟或建立一個文字檔案,只允許寫資料
"at" --- t(text): 文字檔案,可省略不寫,追加開啟一個文字檔案,並在檔案末尾寫資料
"rb" --- 只讀開啟一個二進位制檔案,只允許讀資料
"wb" --- 只寫開啟或建立一個二進位制檔案,只允許寫資料
"ab" --- 追加開啟一個二進位制檔案,並在檔案末尾寫資料
"rt " --- t(text): 文字檔案,可省略不寫,讀寫開啟一個文字檔案,允許讀和寫
"wt " --- t(text): 文字檔案,可省略不寫,讀寫開啟或建立一個文字檔案,允許讀寫
"at " --- 讀寫開啟一個文字檔案,允許讀,或在檔案末追加資料
"rb " --- 讀寫開啟一個二進位制檔案,允許讀和寫
"wb " --- 讀寫開啟或建立一個二進位制檔案,允許讀和寫
"ab " --- 讀寫開啟一個二進位制檔案,允許讀,或在檔案末追加資料
開啟檔案之後,可以呼叫fread()函式,讀取檔案資料,函式定義如下:
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
函式說明:函式從stream檔案指標指向的檔案讀取資料,把資料讀取到ptr快取中。讀取size個資料塊,每個資料塊的容量是count個位元組。所以,總共讀取的位元組數是size*count個位元組。
返回值:返回成功讀取到的資料塊個數,注意,不是位元組數,是引數size表示的資料塊個數。
檔案操作完之後,呼叫fclose()關閉開啟的檔案。函式的定義如下:
int fclose(FILE *fp);
函式說明:關閉引數fp函式指標,該函式指標是fopen()開啟檔案所得。所以,開啟檔案之後,需要關閉該檔案。
下面我們編寫一個程式,呼叫C語言提供的API函式,開啟一個檔案,然後從檔案讀取資料,最後關閉檔案指標。
首先,新建一個test.txt檔案,往裡面存放 "mylinux.vip" 字串,操作如下:
echo "mylinux.vip" > test.txt
就是呼叫echo命令,把"mylinux.vip"字串輸出到test.txt檔案中。然後,用cat命令檢視該檔案的內容,操作如下:
可以看到,test.txt檔案存放了" mylinux.vip "字串。那麼,我們就編寫程式,讀取test.txt檔案中的資料。測試程式碼如下:
呼叫fopen()函式開啟檔案的時候,我們只是想對test.txt檔案進行讀取操作,所以,fopen()函式的第二個引數取值 "r" 字串,表示進行 read 操作。那麼,我們就可以呼叫fread()函式對開啟的檔案進行讀取操作。通過fread()函式,正確讀取到test.txt檔案中存放的資料,把資料讀取到buf[]快取中。最後,呼叫fclose()關閉開啟的檔案指標。