之 關於文件操作函數
文件操作是C語言的最後篇章了,一起來看一下用C語言怎麼操作文件
我們所說的文件不同於一個數據類型,比如一個test.txt文檔,它有自己的一些屬性,比如文件的當前位置、與該文件對應的內存緩沖區地址、文件操作方式等等。這些信息都在專門開辟一定空間的內存中存儲著。
在內存中存儲著是不錯,而且它們還保存在一個結構體類型的變量中,比如:
type struct { int fd;//文件號 int cleft;//緩沖區中剩下的字符 int mode;//文件操作模式 char *nextc;//下一個字符位置 char *buff;//文件緩沖區位置 }FILE; /*FILE是一個存儲文件信息的結構體類型的變量*/
在上述代碼中可以看到,文件號、文件操作模式等信息都存儲在一個結構體中。
這個結構體是系統自己定義的,定義在stdio.h頭文件中,取名為FILE,也就是說FILE是系統名稱,不可改變的,不是自定義。只要程序用到一個文件,系統就為此文件開辟一個如上的結構體變量。需要幾個文件,系統就開辟幾個這樣的結構體。
這些結構體變量不用變量名來標識,而是通過指向結構體類型的指針變量去訪問,這就是文件指針。
比如: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+(追加讀寫方式)打開。
關於之後的字符串函數、數據塊函數和格式化函數我們下一篇文章再一起看,今天實在困死了!
本文出自 “趙玉強的博客” 博客,請務必保留此出處http://zhaoyuqiang.blog.51cto.com/6328846/1296902