3,C语言文件读写
這兩天看到一個關于文件讀寫的題目,索性就把相關內容總結下。
C語言文件讀寫,無非是幾個讀寫函數的應用,fopen(),fread(),fwrite()等,下面簡單介紹下。
一、fopen()
函數原型:FILE *fopen(const char *path, const char *mode);
參數說明:path,所打開的文件名(包含文件路徑,缺省值為當前工程目錄);mode:流形態,后文詳述。
返回值:文件指針。打開失敗,返回NULL;打開成功,返回指向該流的文件指針。
mode詳解:mode就是打開文件的方式,讀寫?二進制?追加在文件末?等等。
r: 只讀方式,文件需存在
r+: 讀寫方式,文件需存在
rb+: 讀寫二進制(binary)文件,不過好像只讀(可以自己測試)
rw+: 讀寫文本文件
w: 只寫文件。若文件存在,則覆蓋原內容;若不存在,新建文件
w+: 讀寫。若文件存在,(寫時)則覆蓋原內容;若不存在,新建文件?
a: append, 只寫文件。若文件存在,追加寫的內容到文件末;若不存在,新建文件
a+: append,讀寫文件。若文件存在,追加寫的內容到文件末;若不存在,新建文件
?
? wb: ?只寫。二進制文件。若不存在,新建文件
? ? ? ?wb+: 讀寫。二級制文件。若不存在,新建文件。
值得注意的是,有的編譯器支持rw等參數,就好比linux中文件的屬性(rwx-421)。
?
二、fopen(), fwrite()
1)函數原型: size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
?參數說明:ptr:數據buffer位置;size:每個數據類型的大小: count:數據的個數; stream:文件指針,指向待讀取的文件
?
2)函數原型:size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);
參數說明: ptr,數據buffer位置;?每個數據類型的大小: count:數據的個數; stream:文件指針,指向待寫入的文件
注意:這兩個函數也是配套fopen()函數來操作的,其讀寫文件的方式取決于fopen函數的mode參數。
?
三、文件讀寫實例
這里,我們把一堆結構體數據寫入我的文件“myfile.dat”, 然后再從中讀取出來,回顯在console上。
1 #include <stdio.h> 2 #include <stdlib.h> 3 #define N 5 4 typedef struct 5 { 6 int num; 7 char name[10]; 8 char tel[10]; 9 } STYPE; 10 void check (); 11 12 int fun (STYPE *std) 13 { 14 FILE *fp = NULL; //定義時,fp最好指向空嗎? 15 int i; 16 if ((fp = fopen ( "myfile.dat ", " wb ")) == NULL) return 0; 17 18 printf(" \noutput data to file ! \n"); 19 for ( i = 0 ; i < N; i ++ ) 20 fwrite (&std[i], sizeof (STYPE), 1, fp); 21 fclose (fp); 22 fp = NULL; 23 return 1 ; 24 } 25 26 int main () 27 { 28 STYPE s[10] = { { 1, "aaaaa", "111111"}, 29 { 1, "bbbbb", "222222"}, 30 { 1, "ccccc", "333333"}, 31 { 1, "ddddd", "444444"}, 32 { 1, "eeeee", "555555"} }; 33 int k; 34 k = fun(s); 35 if (k == 1) 36 { 37 printf("Succeed !"); 38 check() ; 39 } 40 else 41 printf ( " Fail !"); 42 } 43 44 void check() 45 { 46 FILE *fp = NULL ; //定義時,fp最好指向空嗎?? 47 int i; 48 STYPE s[10]; 49 if ((fp = fopen ("myfile.dat ", "rb")) == NULL) 50 { 51 printf ( "Fail ! \n"); 52 exit (0); 53 } 54 printf ("\nRead file and output to screen :\n"); 55 printf ("\n num name tel \n"); 56 for ( i = 0; i < N; i++ ) 57 { 58 fread (&s[i], sizeof ( STYPE ), 1, fp); 59 printf (" % d %s %s \n", s[i].num, s[i].name, s[i].tel); 60 } 61 fclose (fp); 62 fp = NULL; //為了避免dangling pointer? 63 } View Code?
程序運行結果說明:
1)我們觀察工程目錄下,多了一個myfile.dat的文件
2)回顯在console
注意事項:
1)fclose(fp). 文件操作完成后,需要關閉文件流,可能會造成文件占用內存泄露;或者下次訪問文件時,出現不可預料的問題
2)fp = NULL. 文件關閉后,需要將文件指針指向NULL。防止dangling pointer。
3) 在最開始定義文件指針時,需要將其指向NULL嗎?僅從初始化的角度來看,指向NULL也許能避免一些安全問題。
?
轉載于:https://www.cnblogs.com/letgo/p/5728514.html
總結
- 上一篇: 深入理解php底层:php生命周期 [转
- 下一篇: 矩阵从左上到右下的最短距离问题