之 關於文件操做函數ide
文件操做是C語言的最後篇章了,一塊兒來看一下用C語言怎麼操做文件函數
咱們所說的文件不一樣於一個數據類型,好比一個test.txt文檔,它有本身的一些屬性,好比文件的當前位置、與該文件對應的內存緩衝區地址、文件操做方式等等。這些信息都在專門開闢必定空間的內存中存儲着。學習
在內存中存儲着是不錯,並且它們還保存在一個結構體類型的變量中,好比:spa
type struct { int fd;//文件號 int cleft;//緩衝區中剩下的字符 int mode;//文件操做模式 char *nextc;//下一個字符位置 char *buff;//文件緩衝區位置 }FILE; /*FILE是一個存儲文件信息的結構體類型的變量*/ |
在上述代碼中能夠看到,文件號、文件操做模式等信息都存儲在一個結構體中。指針
這個結構體是系統本身定義的,定義在stdio.h頭文件中,取名爲FILE,也就是說FILE是系統名稱,不可改變的,不是自定義。只要程序用到一個文件,系統就爲此文件開闢一個如上的結構體變量。須要幾個文件,系統就開闢幾個這樣的結構體。orm
這些結構體變量不用變量名來標識,而是經過指向結構體類型的指針變量去訪問,這就是文件指針。blog
好比:FILE *fp1,*fp2,*fp3; 當引用文件時,就能夠把這個文件的結構體首地址賦給某個文件指針(*fp1),經過*fp1就能夠調用結構體以找到相關的信息。圖片
通常來講,有幾個文件就有幾個結構體,有幾個結構體就有幾個文件指針。內存
對磁盤文件的操做必須是先打開,而後讀寫,最後關閉。文檔
打開和關閉扮演着重要的角色,打不開文件也就表明着咱們要對文件的操做是徒勞的吧。
1.文件的打開
【格式】fopen(文件名,文件使用方式)
【說明】fopen庫函數,用來打開文件的函數,文件名爲文件所在路徑,文件使用方式有以下幾種:
文件使用方式 |
含義 |
「r」(只讀) |
爲輸入打開一個文本文件 |
「w」(只寫) |
爲輸出打開一個文本文件 |
「a」(追加) |
想文本文件尾增長數據 |
「rb」(只讀) |
爲輸入打開一個二進制文件 |
「wb」(只寫) |
爲輸出打開一個二進制文件 |
「ab」(追加) |
向二進制文件尾增長數據 |
「r+」(讀寫) |
爲讀寫打開一個文本文件 |
「w+」(讀寫) |
爲讀寫打開一個新的文本文件 |
「a+」(讀寫) |
爲讀寫打開一個文本文件 |
「rb+」(讀寫) |
爲讀寫打開一個二進制文件 |
「wb+」(讀寫) |
爲讀寫創建一個新的二進制文件 |
「ab+」(讀寫) |
爲讀寫打開一個二進制文件 |
「t」(文本文件)能夠省略不寫 |
總結開來:就是r爲讀 w爲寫 b爲二進制文件 a爲追加 +爲讀寫。能夠組合使用
【例如】
FILE *fp; fp=fopen("e:\\test.txt","r"); |
含義是:在當前目錄下,打開e盤下的test.txt文檔,只容許「讀」操做,並使fp指向該文件。
【返回值】若是不能成功打開,fopen將帶回一個數字0的返回值,這個0實際上在stdio.h文件中被定義爲空指針值NULL。經常使用下面方法打開一個文件:
if((fp=fopen("e:\\test.txt","rt"))==NULL) { printf("\nConnot open file!");//若是打開不成功則顯示不能打開文件 getchar(); exit(1);//關閉全部文件,終止正調用的過程 } |
2.文件的關閉
文件的關閉是必不可缺乏的操做,若是不關閉文件可能形成數據丟失等後果。
文件的關閉相對來講要簡單不少,只是一個執行命令而已。
【格式】fclose(fp);
【返回值】當順利關閉後,返回0,若是爲非0值,則說明關閉有錯誤。
關閉的過程:先將緩衝區中還沒有存盤的數據寫盤,而後撤銷存放該文件信息的結構體,最後令指向該文件的指針爲空。
關閉完成後若是再想打開文件,則應從新打開。
經常使用的文件讀寫函數有三類:
字符讀寫函數:fgetc()和fputc() (getc和putc)
字符串讀寫函數:fgets()和fputs()
數據塊讀寫函數:fread()和fwrite()
格式化讀寫函數:fscanf()和fprintf()
字符讀寫函數是以字符(字節)爲單位的讀寫函數,也就是說每次操做都是讀入或寫入一個字符。
函數fgetc能夠寫成getc,而fputc能夠寫成putc。
(1)fgetc()字符讀入函數
【格式】ch=fgetc(pf)
【含義】從pf所指定的文件中帶回一個字符賦給ch
【返回值】若是執行fgetc讀字符時遇到文件結束符,函數返回一個文件結束標誌EOF。(EOF在stdio.h中定義爲-1)
【程序實例】
#include<stdio.h> #include<stdlib.h>//exit在此頭文件中 main() { FILE *fp;//定義文件指針 char ch; /*判斷文件打開是否成功*/ /*打開方式爲rt,讀文件方式*/ if((fp=fopen("e:\\test.txt","rt"))==NULL) { printf("\nConnot open file!"); getchar(); exit(1); } ch=fgetc(fp);//從fp所指文件中取出第一個字符 /*從文件中取出全部字符,一個字符一個字符的顯示在中斷上*/ while(ch!=EOF) { putchar(ch);//輸出一個字符 ch=fgetc(fp);//取出一個字符 } fclose(fp); printf("\n"); } |
而後執行程序,結果以下
【注意】程序中的路徑必定要寫正確了
Fgetc函數調用時,讀取文件的方式必須是以讀或者是讀寫的方式打開的。
(2)fputc()字符寫入函數
【格式】fputc(ch,fp)
【含義】將字符ch寫到文件指針fp所指的文件中。
【返回值】若是寫入成功,返回寫入的內容ch,若是輸出失敗,則返回一個EOF值。
【程序實例】
#include<stdio.h> #include<stdlib.h> main() { FILE *fp;//定義文件指針 char ch; /*判斷文件打開是否成功*/ /*打開方式爲wt,寫文件方式*/ if((fp=fopen("e:\\test.txt","wt+"))==NULL) { printf("\nConnot open file!"); getchar(); exit(1); } /*輸入的字符一個一個的寫入到文件中*/ printf("請輸入一個字符串\n"); ch=getchar(); while(ch!='\n') { fputc(ch,fp);//將ch寫入到文件中 ch=getchar(); } rewind(fp);//將文件的指針指向文件開頭 /*用fgetc來輸出文件的內容*/ printf("寫入文件的內容是:\n"); ch=fgetc(fp); while(ch!=EOF) { putchar(ch); ch=fgetc(fp); } printf("\n"); fclose(fp); }
好了,程序顯示內容寫入test.txt文件中而且輸出了,咱們找到e:\\test.txt下,打開test.txt看看是否有「李敏是個乖老婆」這句話。
能夠看到的確是有了。
【注意事項】
在上述程序中咱們能夠注意到這麼一個問題,test.txt文件中原本就有了其它的內容(趙玉強的博客 http://zhaoyuqiang.blog.51cto.com),可是執行完上述程序後,文件中原來的內容不見了,取而代之的是新的內容(李敏是個乖老婆),若是想原來內容不刪除的話,訪問方式應該改成a+(追加讀寫方式)打開。