檔案類型分為:流檔案和裝置檔案,裝置檔案比如:vga接口,序列槽,usb口,網口,序列槽,這些接口都被作業系統抽象成為了檔案。
當我們寫程式的時候預設已經幫我們打開了三個檔案
分别是: stdin:标準輸入,stdout:标準輸出,stderr:标準出錯,scanf實際上接收的是标準輸入的資料,這時候的标準輸入就是我們的鍵盤。
有四種方式清空緩沖區:
a、加’\n’;
b、程式正常退出;
c、通過fflush(stdout)也可以清空緩沖區。
d、緩沖區用滿了自動清空緩沖區(程式總預設的緩沖區大小是8192位元組(這是c标準定義的))。
如果設計緩沖區,最好使用隊列的方式進行設計。c語言中使用緩沖區的原因是為了提高緩沖區。我們所說的重新整理緩沖區是指重新整理stdout這裡面的緩沖區。
3、觀察以下檔案:
(1)當加上了’\n’(行緩沖重新整理,當遇到磁盤檔案的時候,這個’\n’就不好使了)之後,效果圖如下:
這時候可以列印出helloworld,說明‘\n’可以使程式列印出來結果。
(2)、注釋while(1);這次程式運作結果如下:
上面的現象說明:如果程式正常退出,同樣能夠列印出helloworld
(3)使用fflush(stdout);同樣可以将字元串輸出。
(4)第四種方式是等待程式中的緩沖區使用完了。
上面的這種方式說明,如果緩沖區滿了,同樣可以列印出結果值。
總結:有四種方式清空
4、檢視頭檔案中定義的方式是cd /usr/include
檢視cat libio.h可以檢視到file
file本質:
fopen:打開檔案,參數類型是:file *fopen(const char *path,const
char *mode);
其中第一個參數表示要打開的檔案的路徑,mode表示通路屬性:讀寫附加,fope最後傳回的是一個檔案指針類型(這裡的路徑可以是相對路徑和絕對路徑,建議使用絕對路徑),它是file類型,是一個結構體。file是一個結構體,是通過typedef定義出來的file.
file類型:
mode類型有6種:
mode檔案類型
操作方式
r
以讀的方式打開檔案,讀寫指針的位置,在檔案開頭
w
寫打開檔案,如果檔案不存在,建立檔案,如果檔案存在,截斷源檔案(所謂的源檔案是指隻出現一部分記憶體),讀寫指針在檔案開頭
a
追加寫打開檔案,如果檔案不存在,建立檔案,
r+
可讀可寫的方式打開檔案,如果檔案不存在,也不建立
w+
可讀可寫打開檔案,如果檔案不存在,則建立檔案,如果存在,則截斷
a+
可讀可寫追加打開檔案,如果檔案不存在,則建立
window作業系統多出的方式
rb
操作的是二進制檔案,其它含義同r
wb
ab
fclose:關閉檔案,參數類型是:int fclose(file *fp);參數中的表示制定的檔案。要注意的是fclose實際上也調用了fflush()函數。
注意:上面的”w“可以改成a
根據檔案自有屬性,确定打開檔案的屬性,注意越權通路。
打開檔案的時候,如果成功放回的是一個指針,如果失敗傳回的是null
作業系統預設打開的最大檔案數量是1024,但是這個最多檔案數量是可以修改的。
5、檔案操作函數:
fgets:每次從系統中讀出一行。原型:int *fgets(char *s,int size,file *stream); 最終将内容存儲到size中。
參數:
*s:字元型指針,指向用來存儲所得資料的位址。
size:整型資料,緻命存儲資料的大小。
*stream:檔案結構指針,将要讀取的檔案流。
傳回值:
1、成功,則傳回第一個參數s
2、在讀字元時遇到end-of-file,則eof訓示器備設定,如果還沒有讀入任何字元就遇到這種情況,則buf保持原來的内容,傳回null;
3、如果發生讀入錯誤,error訓示器被設定,傳回null,buf的值可能被改變。
fputs:往檔案中寫一行,原型:int fputs(const char *s,file *stream);
運作結果如下:
檔案拷貝的代碼:
fgetc:一次讀一個字元函數原型:int
fgets(file *fp),傳回一個被讀的一個字元。當讀錯了時傳回eof
意為:從檔案指針stream指向的檔案中讀取一個字元,讀取一個位元組後,光标位置後移一個位元組。
fgetc()會傳回讀取到的字元,若傳回eof則表示到了檔案尾,或出現了錯誤。
範例
fputc:
函數名稱:寫字元檔案函數fputc();
函數格式:int fputc(int n,file *fp)
參數解釋:fp為檔案指針,它的值是執行fopen()打開檔案時獲得的。
n為輸出的字元量。
雖然函數被定義為整形數,但僅用其低八位。
傳回值:在正常調用情況下,函數傳回讀取字元的ascii碼值,出錯時,傳回eof(-1),當正确寫入一個字元或一個位元組
的資料後,檔案内部寫指針會自動後移一個位元組的位置。eof是在頭檔案stdio.h中定義的宏。
<code> </code><code>size_t fread(void *ptr,size_t size,size_t nmemb,file *fp);是一個函數。從一個檔案流中讀資料,最多讀nmemb個元素,每個元素size個位元組,如果調用成功傳回實際讀取到的元素個數,如果不成功傳回0 </code>
<code> 以記錄的方式度檔案,每個記錄的大小為size,要讀nmemb個元素,size_t fread(void *ptr,size_t size,size_t nmemb,file *fp); 從*fp中讀 nmemb表示請求多少個元素。size:表示讀多少,讀到*ptr中,這裡的fread也是以二進制方式進行讀。</code>
fwrite:以記錄的方式寫檔案,fwrite寫的是一個二進制。
函數原型:size_t fwrite(const void* buffer,size_t size,size_t count,file *stream);
注意:這裡的函數以二進制形式對檔案進行操作,不局限域文本檔案
傳回值:傳回實際寫入的資料塊資料
buffer:是一個指針,對fwrite來說,是要擷取資料的位址;
size:要寫入内容的單位元組數
count:要進行寫入size位元組的資料項的個數。
stream:目标檔案指針;
傳回實際寫入的資料項個數count.(size_t在32位平台上是unsigned int,在64位平台上是long
unsigned int)
fflush(file *fp):重新整理緩沖區
fflush(file *fp)
當程式自動退出的時候,也能調用fflush()了。當main函數return的時候調用了函 數重新整理方法。exit(main()); 會關閉打開的檔案,釋放申請的記憶體。
feof:測試檔案是否達到了末尾
fseek:
當fseek中的第二個參數過大時,這文時候表示拓展一個件。注意要拓展的時候在第二次執行寫操作的時候才真正拓展檔案。
rewind:将讀寫指針檔案的指針指向檔案開頭。但是功能是fseek的功能強,可以了解是rewind調用了fseek.