C語言 緩衝檔案系統及對它的讀寫(檔案相關知識)

2021-10-01 09:39:12 字數 4911 閱讀 4981

所謂檔案,是指儲存在外部介質上的資料集合,是一批邏輯上有聯絡的資料。這個資料集有乙個名稱,教授作檔名。

二進位制檔案,所有資料都按照二進位制方式儲存的檔案,稱作二進位制檔案。 一般來說,二進位制檔案節省儲存空間並且輸入或輸出的速度較快。

緩衝區是在開啟檔案時分配的,每當開啟乙個檔案,系統就給該檔案在記憶體中分配快取區(預設是512位元組),資料無論是從計算機輸入到檔案,還是從檔案中讀入到計算機,都要經過緩衝區。

在庫函式stdio.h中專門定義了一種結構體,取名叫file,定義如下:

typedef

struct{

short level;

/*緩衝區滿或空的狀態*/

unsigned flags;

/*檔案狀態標誌*/

char fd;

/*檔案描述字*/

unsigned

char hold;

/*如無緩衝區不讀字元*/

short bsize;

/*緩衝區大小*/

unsigned

char

*buffer /*緩衝區首位址*/

unsigned

char

*curp /*當前位置指標,指向正要讀的位元組*/

unsigned istemp;

unsigned token;

}file;

定義檔案指標的一般形式為:

file *指標變數名;
例如file * fp;表示定義了乙個檔案型別的指標變數fp,只要將乙個檔案型別的結構體變數的位址賦給fp,fp便指向該檔案型別的結構體變數。可以利用fp實現對該檔案的各種操作。

接下來是對於檔案的開啟關閉的操作。

fopen()函式的呼叫方式:

fopen(檔名,檔案使用方式);
通常是將fopen()函式的返回值賦予乙個指向檔案的指標變數。如:

file * fp;

fp=fopen(「al.txt」,「w」);

意義為開啟當前目錄下的檔案al.txt,且只能進行「寫」操作,並使fp指向該檔案。

當然fopen函式還有很多種用法,如何去使用,還是要通過使用者自己去設定,必須是編譯系統知道三個資訊:

需要開啟的檔案位址及名字;

對所開啟檔案需要進行什麼操作;

使哪個檔案型別指標去指向該檔案。

關於開啟檔案再舉一栗子:

file * fp;

fp=fopen(「d:\\study\\wo.txt」,「w」);

其意義是開啟d磁碟驅動器的study目錄下的檔案wo.txt,對其進行只寫操作。

關於對開啟檔案的操作列舉:

檔案使用方式 --------------- 含義

rb(唯讀):開啟乙個已存在的二進位制檔案,只能從中讀取資料;

wb(只寫):開啟或新建乙個二進位制檔案,只能寫入資料;若檔案已存在則覆蓋原全部內容;

ab(追加):開啟已存在的二進位制檔案,並在檔案末尾寫入資料;

rb+(讀寫):開啟或新建乙個二進位制檔案,允許讀寫,若檔案已存在,寫入時覆蓋檔案全部內容;

rw+(讀寫):開啟或新建乙個二進位制檔案,允許讀寫,若檔案已存在,寫入時覆蓋檔案全部內容;

ra+(讀寫):開啟乙個已存在的二進位制檔案,可以讀出資料也可以在檔案末尾寫入資料;

說明

fp=fopen(「file」,「r」);

if(fp==null)

在開啟檔案並完成一定的操作之後,必須要通過fclose()函式將其關閉,否則可能會造成資料丟失。

fclose()函式呼叫的一般形式:

fclose(檔案指標);
例如:fclose(fp);

引數fp是當初開啟檔案時fopen()函式的返回值。函式執行成功返回0,否則返回-1。

當檔案被成功關閉之後,其檔案指標就不再指向人和檔案了,當然可以重用,用於指向另乙個檔案。注意乙個檔案指標在某一時刻只能以一種方式開啟乙個檔案。

字元讀寫函式:fgetc()和fputc()

字串讀寫函式:fgets()和fputs()

格式化讀寫函式:fscanf()和fprintf()

資料塊讀寫函式:fread()和fwrite()

fgetc()

從指定檔案讀入乙個字元,該檔案必須是以讀或讀寫方式開啟的。

呼叫形式:

字元變數=fgetc(檔案指標);
fputc()

把乙個字元寫入到磁碟檔案中。一般形式為:

fputc(字元,檔案指標);
其中,字元可以使字元變數,也可以是字元常量。寫資料成功後,同時將讀寫位置指標向前移動乙個位元組,及指向下乙個寫入位置。

fgets()

從指定檔案讀入乙個字串,該檔案必須是以讀或讀寫方式開啟的。呼叫形式為:

fgets(str,n,fp);
其中n是要求得到的字串個數,但實際上唯讀到n-1個字元,然後在最後加乙個『\0』字元,再作為整體放到字串陣列str中。執行fgets()成功,返回str陣列首位址,如果一開始就遇到檔案尾或讀資料錯誤,返回null。

fputs()

把乙個字串寫入到磁碟檔案上。一般形式為:

fputs(str,fp);
功能為把字串str寫入到fp所指向的檔案,fputs()函式中第乙個引數可以是字串常量,字串陣列名或字元型指標。字串末尾的「\0」不輸出,輸出成功,函式值為0;失敗,函式值為eof。

fscanf()

呼叫格式為:

fscanf(fp,格式控制串,輸入列表);
其中,fp是指向要讀取檔案的檔案型指標,區別於scanf函式讀寫物件是鍵盤,fscanf函式讀寫物件是檔案。

功能是從fp指向的檔案中,按格式控制串中的控制符讀取相應資料賦予輸入列表中對應的變數。

栗子:fscanf(fp,"%d,%f",&a,&f);:其從指定的磁碟檔案中讀取ascii字元,並按「%d」和「%f」格式轉換成二進位制形式的資料給變數a,f。

fprintf()

呼叫格式為:

fprintf(fp,格式控制串,輸出列表);
其中,fp是指向要寫入檔案的檔案型指標,區別於printf函式讀寫物件是顯示器,fprintf函式讀寫物件是檔案。

fread()

該函式用來從指定檔案中讀取乙個指定位元組的資料塊。呼叫形式為:

fread(buffer,size,count,fp);
其中,buffer為讀入資料在記憶體中存放的起始位址;size為每次要讀取的字元數;count為要讀取的次數;fp為檔案型別指標。

功能是從檔案中讀count個字段,每個字段長度為size個位元組,並把他們存放到buffer指標所指的緩衝器中。

栗子:fread(a,4,5,fp);:從fp所指的檔案中,每次讀4個位元組即乙個實數放到陣列a中,連續讀5次,即讀5個實數到陣列a中。

fwrite()

該函式用來將資料輸出到磁碟檔案上。呼叫形式為:

fwrite(buffer,size,count,fp);
功能是把buffer指標所指的緩衝器中,長度為size個位元組和count個字段寫到fp所指向的檔案中去。

注意:用fread()和fwrite()函式按「記錄」讀寫,所以必須用二進位制方式開啟檔案。

位置指標復位函式:rewind ()函式

在不關閉檔案的情況下,回到檔案頭重新讀寫檔案。呼叫形式為:

rewind(fp);
功能是使檔案內部的位置指標指到檔案的開頭,此函式沒有返回值。

隨機讀寫函式:fseek()函式

呼叫形式:

fseek(fp,offset,fromwhere);
其中,fp是檔案型別指標,offset為檔案位置指標的位移量,指以起始位置為基準值順著自動讀寫方向移動的位元組數,它是乙個長整型量,如果它的值為負數,表示逆著自動讀寫方向移動。fromwhere表示檔案位置指標起始計算位置,其中fromwhere在stdio.h中定義如表:

········· 符號常數 — 數值 — 含義

seek_set — 0 — 從檔案開頭

seek_cur — 1 — 從當前位置

seek_end — 2 — 從檔案末尾

fseek函式作用是將檔案的位置指標設定到從fromwhere開始的第offset位元組的位置上,它一般用於對二進位制檔案進行操作。

栗子:fseek(fp,100l,0);:將位置指標移到離檔案頭100個位元組處。

返回檔案當前位置函式:

ftell()函式的作用是得到檔案中位置指標的當前位置,呼叫形式為:

ftell(檔案指標);
檔案位置是以檔案開始處到當前位置的位移量位元組數表示,如果ftell()函式返回值為-1l,則表示出錯。

C語言的檔案系統

c檔案系統由若干互相聯絡的函式構成,這類函式要求包含標頭檔案。常用的緩衝檔案系統函式有 fopen 開啟乙個檔案 fclose 關閉乙個檔案 putc fputc 向檔案寫乙個字元 getc fgetc 從檔案中讀取乙個字元 fgets 從檔案中讀一字串 fputs 寫字串到檔案 fseek 寫檔案...

對python檔案讀寫的緩衝行為詳解

檔案www.cppcns.com的io操作的緩衝行ohujtda為分為 全緩衝 同系統及磁碟塊大小有關,n個位元組後執行一次寫入操作 行緩衝 遇到換行符執行一次寫操作 無緩衝 立刻執行寫操作 open 函式 help open help on built in function 程式設計客棧open...

在Linux上實現對UFS檔案系統的讀寫支援

b 背景 b 最近在使用xen虛擬機器,xen官方目前發布的核心只有2.6.18的版本。現在需要在linux上掛載 mount freebsd的image檔案,並進行寫操作。freebsd使用的檔案系統是ufs2,但2.6.18的核心上只能對ufs進行讀操作,寫的操作是從2.6.21的核心才開始支援...