天天看點

檔案類型,c語言檔案讀寫,檔案緩沖,檔案打開方式,檔案操作函數

檔案類型分為:流檔案和裝置檔案,裝置檔案比如:vga接口,序列槽,usb口,網口,序列槽,這些接口都被作業系統抽象成為了檔案。

當我們寫程式的時候預設已經幫我們打開了三個檔案

分别是: stdin:标準輸入,stdout:标準輸出,stderr:标準出錯,scanf實際上接收的是标準輸入的資料,這時候的标準輸入就是我們的鍵盤。

檔案類型,c語言檔案讀寫,檔案緩沖,檔案打開方式,檔案操作函數

  有四種方式清空緩沖區:

     a、加’\n’;

           b、程式正常退出;

     c、通過fflush(stdout)也可以清空緩沖區。

     d、緩沖區用滿了自動清空緩沖區(程式總預設的緩沖區大小是8192位元組(這是c标準定義的))。

如果設計緩沖區,最好使用隊列的方式進行設計。c語言中使用緩沖區的原因是為了提高緩沖區。我們所說的重新整理緩沖區是指重新整理stdout這裡面的緩沖區。

3、觀察以下檔案:

檔案類型,c語言檔案讀寫,檔案緩沖,檔案打開方式,檔案操作函數

    (1)當加上了’\n’(行緩沖重新整理,當遇到磁盤檔案的時候,這個’\n’就不好使了)之後,效果圖如下:

檔案類型,c語言檔案讀寫,檔案緩沖,檔案打開方式,檔案操作函數

     這時候可以列印出helloworld,說明‘\n’可以使程式列印出來結果。

    (2)、注釋while(1);這次程式運作結果如下:

檔案類型,c語言檔案讀寫,檔案緩沖,檔案打開方式,檔案操作函數

上面的現象說明:如果程式正常退出,同樣能夠列印出helloworld

           (3)使用fflush(stdout);同樣可以将字元串輸出。

檔案類型,c語言檔案讀寫,檔案緩沖,檔案打開方式,檔案操作函數

    (4)第四種方式是等待程式中的緩沖區使用完了。

檔案類型,c語言檔案讀寫,檔案緩沖,檔案打開方式,檔案操作函數

     上面的這種方式說明,如果緩沖區滿了,同樣可以列印出結果值。

     總結:有四種方式清空

   4、檢視頭檔案中定義的方式是cd /usr/include

        檢視cat libio.h可以檢視到file

檔案類型,c語言檔案讀寫,檔案緩沖,檔案打開方式,檔案操作函數
檔案類型,c語言檔案讀寫,檔案緩沖,檔案打開方式,檔案操作函數

             file本質:

檔案類型,c語言檔案讀寫,檔案緩沖,檔案打開方式,檔案操作函數

fopen:打開檔案,參數類型是:file *fopen(const char *path,const

char *mode);

    其中第一個參數表示要打開的檔案的路徑,mode表示通路屬性:讀寫附加,fope最後傳回的是一個檔案指針類型(這裡的路徑可以是相對路徑和絕對路徑,建議使用絕對路徑),它是file類型,是一個結構體。file是一個結構體,是通過typedef定義出來的file.

file類型:

檔案類型,c語言檔案讀寫,檔案緩沖,檔案打開方式,檔案操作函數

mode類型有6種:

mode檔案類型

操作方式

r

以讀的方式打開檔案,讀寫指針的位置,在檔案開頭

w

寫打開檔案,如果檔案不存在,建立檔案,如果檔案存在,截斷源檔案(所謂的源檔案是指隻出現一部分記憶體),讀寫指針在檔案開頭

a

追加寫打開檔案,如果檔案不存在,建立檔案,

r+

可讀可寫的方式打開檔案,如果檔案不存在,也不建立

w+

可讀可寫打開檔案,如果檔案不存在,則建立檔案,如果存在,則截斷

a+

可讀可寫追加打開檔案,如果檔案不存在,則建立

window作業系統多出的方式

rb

操作的是二進制檔案,其它含義同r

wb

ab

fclose:關閉檔案,參數類型是:int fclose(file *fp);參數中的表示制定的檔案。要注意的是fclose實際上也調用了fflush()函數。

檔案類型,c語言檔案讀寫,檔案緩沖,檔案打開方式,檔案操作函數

注意:上面的”w“可以改成a

   根據檔案自有屬性,确定打開檔案的屬性,注意越權通路。

   打開檔案的時候,如果成功放回的是一個指針,如果失敗傳回的是null

檔案類型,c語言檔案讀寫,檔案緩沖,檔案打開方式,檔案操作函數

       作業系統預設打開的最大檔案數量是1024,但是這個最多檔案數量是可以修改的。

檔案類型,c語言檔案讀寫,檔案緩沖,檔案打開方式,檔案操作函數
檔案類型,c語言檔案讀寫,檔案緩沖,檔案打開方式,檔案操作函數

    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的值可能被改變。

檔案類型,c語言檔案讀寫,檔案緩沖,檔案打開方式,檔案操作函數

fputs:往檔案中寫一行,原型:int fputs(const char *s,file *stream);     

檔案類型,c語言檔案讀寫,檔案緩沖,檔案打開方式,檔案操作函數

               運作結果如下:

檔案類型,c語言檔案讀寫,檔案緩沖,檔案打開方式,檔案操作函數

       檔案拷貝的代碼:

檔案類型,c語言檔案讀寫,檔案緩沖,檔案打開方式,檔案操作函數
檔案類型,c語言檔案讀寫,檔案緩沖,檔案打開方式,檔案操作函數

              fgetc:一次讀一個字元函數原型:int

fgets(file *fp),傳回一個被讀的一個字元。當讀錯了時傳回eof

                     意為:從檔案指針stream指向的檔案中讀取一個字元,讀取一個位元組後,光标位置後移一個位元組。

檔案類型,c語言檔案讀寫,檔案緩沖,檔案打開方式,檔案操作函數

                 fgetc()會傳回讀取到的字元,若傳回eof則表示到了檔案尾,或出現了錯誤。

                          範例

檔案類型,c語言檔案讀寫,檔案緩沖,檔案打開方式,檔案操作函數

                 fputc:

                         函數名稱:寫字元檔案函數fputc();

                         函數格式:int fputc(int n,file *fp)

                         參數解釋:fp為檔案指針,它的值是執行fopen()打開檔案時獲得的。

                         n為輸出的字元量。

                         雖然函數被定義為整形數,但僅用其低八位。

                         傳回值:在正常調用情況下,函數傳回讀取字元的ascii碼值,出錯時,傳回eof(-1),當正确寫入一個字元或一個位元組

                                  的資料後,檔案内部寫指針會自動後移一個位元組的位置。eof是在頭檔案stdio.h中定義的宏。

檔案類型,c語言檔案讀寫,檔案緩沖,檔案打開方式,檔案操作函數
檔案類型,c語言檔案讀寫,檔案緩沖,檔案打開方式,檔案操作函數
檔案類型,c語言檔案讀寫,檔案緩沖,檔案打開方式,檔案操作函數
檔案類型,c語言檔案讀寫,檔案緩沖,檔案打開方式,檔案操作函數

<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):重新整理緩沖區

檔案類型,c語言檔案讀寫,檔案緩沖,檔案打開方式,檔案操作函數

 fflush(file *fp)

檔案類型,c語言檔案讀寫,檔案緩沖,檔案打開方式,檔案操作函數

       當程式自動退出的時候,也能調用fflush()了。當main函數return的時候調用了函           數重新整理方法。exit(main());   會關閉打開的檔案,釋放申請的記憶體。 

       feof:測試檔案是否達到了末尾

fseek:

檔案類型,c語言檔案讀寫,檔案緩沖,檔案打開方式,檔案操作函數

當fseek中的第二個參數過大時,這文時候表示拓展一個件。注意要拓展的時候在第二次執行寫操作的時候才真正拓展檔案。

rewind:将讀寫指針檔案的指針指向檔案開頭。但是功能是fseek的功能強,可以了解是rewind調用了fseek.



繼續閱讀