程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 文件類型,c語言文件讀寫,文件緩沖,文件打開方式,文件操作函數

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

編輯:關於C語言

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


文件類型分為:流文件和設備文件,設備文件比如: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中定義的宏。

    \

    \

    \

    \ 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);

    注意:這裡的函數以二進制形式對文件進行操作,不局限域文本文件

    返回值:返回實際寫入的數據塊數據

    1. buffer:是一個指針,對fwrite來說,是要獲取數據的地址;

    2. size:要寫入內容的單字節數

    3. count:要進行寫入size字節的數據項的個數。

    4. stream:目標文件指針;

    5. 返回實際寫入的數據項個數count.(size_t在32位平台上是unsigned int,在64位平台上是long unsigned int)

      fflush(FILE *fp):刷新緩沖區

      \

      fflush(FILE *fp)

      \

      當程序自動退出的時候,也能調用fflush()了。當main函數return的時候調用了函 數刷新方法。exit(main()); 會關閉打開的文件,釋放申請的內存。

      feof:測試文件是否達到了末尾

      1. fseek:\

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

        rewind:將讀寫指針文件的指針指向文件開頭。但是功能是fseek的功能強,可以理解是rewind調用了fseek.

        

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved