當我們寫程序的時候默認已經幫我們打開了三個文件
分別是: 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中定義的宏。
size_t fread(void *ptr,size_t size,size_t nmemb,FILE *fp);是一個函數。從一個文件流中讀數據,最多讀nmemb個元素,每個元素size個字節,如果調用成功返回實際讀取到的元素個數,如果不成功返回0
以記錄的方式度文件,每個記錄的大小為size,要讀nmemb個元素,size_t
fread(void *ptr,size_t size,size_t nmemb,FILE *fp); 從*fp中讀 nmemb表示請求多少個元素。size:表示讀多少,讀到*ptr中,這裡的fread也是以二進制方式進行讀。
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.