關於C語言檔案的操作
關於C語言的檔案操作之前我也寫過一篇部落格來介紹,但是當時寫的很不全面,只是簡單的使用了一下 ,今天再從新學習一下。
1、檔案的寫
首先還是先看一個簡單的例子:
include<stdio.h> int main() { FILE *fp; //宣告一個檔案指標,指向檔案緩衝區的首地址 char ch; if( (fp = fopen("file_1.txt","a")) == NULL ) //w+開啟可讀寫檔案,若檔案存在則清零,不存在則新建檔案,a 模式不清零 { printf("Cannot open file, press any key to exit!"); //檔案無法開啟 } printf("Input a string:\n"); while ((ch = getchar()) != '\n' ) { putc(ch,fp); //該函式將字元寫入檔案,與 fputc 的區別? } fclose(fp); return 0; }
這個例子就是實現開啟或新建一個文字檔案,然後寫入使用者在控制檯輸入的資料。
關於檔案操作首先是:
FILE *fp;
這個FILE是檔案型別識別符號,是C編譯系統定義好的一個結構體型別
其定義一個指標變數 fp,該變數用於指向一個檔案,存放的是檔案緩衝區的首地址。該指標又叫檔案指標,
檔案指標是一個指向檔案開頭的指標。使用檔案指標,我們可以開啟或者關閉一個檔案,同時,我們也可以使用檔案指標將資料的讀寫位置移動到檔案的任意位元組位置。
然後使用fopen函式開啟或新建一個檔案:
fopen() 函式用來開啟一個檔案,該函式接受兩個字串型別的引數:檔名(filename)、開啟模式(open mode)
fopen("filename","open mode")
當使用該函式開啟一個檔案時,返回一個指標,該指標指向檔案的開始位置,稱為檔案指標,
那麼為了接收它返回的檔案指標,我們需要事先宣告一個檔案指標: FILE *fp
如果因為某些系統內部原因導致檔案無法開啟,則函式返回空指標 NULL
所以為了避免檔案開啟失敗導致的程式異常,開啟檔案一般按照如下格式:
if( (fp = fopen("file_1.txt","a")) == NULL ) //w+開啟可讀寫檔案,若檔案存在則清零,不存在則新建檔案,a 模式不清零 { printf("Cannot open file, press any key to exit!"); //檔案無法開啟 }
在下面就是獲取使用者輸入,使用一個while迴圈持續的獲取輸入,
while ((ch = getchar()) != '\n' ) { putc(ch,fp); }
再此使用 \n 作為結束標誌,即只能在控制檯輸入一行字串,
若使用EOF,則可以多行輸入,用 ctrl+z 表示輸入結束,該組合鍵代表標準輸入檔案的結束。
下一句 putc(ch,fp); 就是吧使用者輸入的字元寫入檔案,注意這裡是一個字元一個字元寫入的,因為輸入用的是getchar函式,
如果是字串輸入寫入的話,可以使用 fputc()函式直接寫入一個字串。
最後也是非常重要的一步,對檔案讀寫完畢後需要關閉檔案,防止檔案開啟過多造成的檔案讀寫混亂。
使用 fclose()函式關閉一個檔案,
關閉檔案,正常關閉時返回0,否則返回1
關閉時,系統會清除緩衝區,並把資料輸出到磁碟檔案,釋放緩衝單元,使檔案指標與具體檔案脫鉤。
fclose(fp);
2、檔案的讀
到這裡關於檔案的寫操作就基本上是這些,下面是關於檔案的讀操作,其實和寫差不多。
還是先看一下完整的程式碼,方便和上面的寫操作對比:
#include <stdio.h> #include <stdlib.h> int main() { FILE *fp; char ch; char str[80]; char file_name[15]; //輸入檔名稱緩衝 //如果檔案和本程式在同一個檔案下面,則直接輸入txt檔名即可 //如果不在同一目錄下面,則需要輸入完整檔案路徑格式 //如 : e:\\test.txt printf("please enter the filename: "); //注意輸入檔名時需要帶上檔案的字尾.txt gets(file_name); //gets函式用來讀取使用者輸入的字串,專門針對字串處理設計的 if((fp = fopen(file_name,"r")) == NULL ) //r模式不能寫入資料,只能讀取 { printf("Cannot open file, press any key to exit!\n"); //檔案無法開啟 exit(0); } /* while( (ch = getc(fp)) != EOF ) //getc函式從檔案中讀取單個字元 { putchar(ch); //迴圈輸出單個字元 } putchar('\n'); //輸出一個換行 */
while((fgets(str,80,fp)) != NULL) puts(str); fclose(fp); }
開始的開啟檔案方式和寫操作的差不多,就是多了一個使用者自己輸入檔案的路徑和名稱。
然後程式用了兩種方式來讀取檔案內容,一個是使用fgetc函式讀取單個字元,然後輸出,一直迴圈,直到讀取到檔案的末尾。
另一種方式是使用特殊的 fgets() 函式來一次性讀取80個位元組的內容:
fgets 函式從 fp 檔案中讀取 80 個位元組的資料到str陣列中,然後用 puts 函式輸出。
當到達檔案末尾時, 函式返回 NULL,若要持續讀出字串,則迴圈檢測每次讀出80個位元組後是否到達檔案末尾。
關於檔案的操作還有很多深入的內容,後面學習了之後再繼續分享。。。。。。。