C語言詳解FILE檔案操作

2021-10-06 10:03:16 字數 4600 閱讀 9276

c語言詳解file檔案操作@toc

需要了解的概念

需要理解的知識點包括:資料流、緩衝區、檔案型別、檔案訪問方式

1.1 資料流:

指程式與資料的互動是以流的形式進行的。進行c語言檔案的訪問時,都會先進行「開啟檔案」操作,這個操作就是在開啟資料流,而「關閉檔案」操作就是關閉資料流。

1.2 緩衝區(buffer):

指在程式執行時,所提供的額外記憶體,可用來暫時存放做準備執行的資料。它的設定是為了提高訪問效率,因為記憶體的訪問速度比磁碟驅動器快得多。

c語言中帶緩衝區的檔案處理:

c語言的檔案處理功能依據系統是否設定「緩衝區」分為兩種:一種是設定緩衝區,另一種是不設定緩衝區。由於不設定緩衝區的檔案處理方式,必須使用較低階的i/o函式(包含在標頭檔案io.h和fcntl.h中)來直接對磁碟訪問,這種方式的訪問速度慢,並且由於不是c的標準函式,跨平台操作時容易出問題。下面只介紹第一種處理方式,即設定緩衝區的檔案處理方式:

當使用標準i/o函式(包含在標頭檔案stdio.h中)時,系統會自動設定緩衝區,並通過資料流來讀寫檔案。當進行檔案讀取時,不會直接對磁碟進行讀取,而是先開啟資料流,將磁碟上的檔案資訊拷貝到緩衝區內,然後程式再從緩衝區中讀取所需資料,如下圖所示:

事實上,當寫入檔案時,並不會馬上寫入磁碟中,而是先寫入緩衝區,只有在緩衝區已滿或「關閉檔案」時,才會將資料寫入磁碟,如下圖所示。

1.3 檔案型別:

分為文字檔案和二進位制檔案兩種。

文字檔案是以字元編碼的方式進行儲存的。二進位制檔案將記憶體中資料原封不至檔案中,適用於非字元為主的資料。如果以記事本開啟,只會看到一堆亂碼。

其實,除了文字檔案外,所有的資料都可以算是二進位制檔案。二進位制檔案的優點在於訪問速度快,占用空間小,以及可隨機訪問資料。

1.4 檔案訪問方式:

包括順序訪問方式和隨機訪問方式兩種。

隨機訪問方式多半以二進位制檔案為主。它會以乙個完整的單位來進行資料的讀取和寫入,通常以結構為單位。

文字檔案操作

c語言中主要通過標準i/o函式來對文字檔案進行處理。相關的操作包括開啟、讀寫、關閉與設定緩衝區。

相關的訪問函式有:fopen(), fclose(), fgetc(), fputc(), fgets(), fputs(), fprintf(), fscanf()等。

2.1 開啟檔案

函式原型為:_crtimp file * __cdecl fopen(const char *, const char *);

第一引數為檔名,第二個引數為開啟模式。

file *fp;

fp = fopen(「c:\temp\test.txt」, 「r」) //由於反斜槓\是控制字元,所以必須再加乙個反斜槓

使用fopen()函式開啟的檔案會先將檔案複製到緩衝區。注意:所下達的讀取或寫入動作,都是針對緩衝區進行訪問而不是磁碟,只有當使用fclose()函式關閉檔案時,緩衝區中的資料才會寫入磁碟。

談檔案開啟模式

「r」:只能從檔案中讀資料,該檔案必須先存在,否則開啟失敗

「w」:只能向檔案寫資料,若指定的檔案不存在則建立它,如果存在則先刪除它再重建乙個新檔案

「a」:向檔案增加新資料(不刪除原有資料),若檔案不存在則開啟失敗,開啟時位置指標移到檔案末尾

「r+」:可讀/寫資料,該檔案必須先存在,否則開啟失敗

「w+」:可讀/寫資料,用該模式開啟新建乙個檔案,先向該檔案寫資料,然後可讀取該檔案中的資料

「a+」:可讀/寫資料,原來的檔案不被刪去,位置指標移到檔案末尾

開啟二進位制檔案的模式與開啟文字檔案的含義是一樣的,不同的是模式名稱裡面多乙個字母』b』,以表示以二進位制形式開啟檔案。

2.2 關閉檔案

函式原型為:_crtimp int __cdecl fclose(file *);

關閉成功返回值0,否則返回非零值。

注:在執行完檔案的操作後,要進行「關閉檔案」操作。雖然程式在結束前會自動關閉所有的開啟檔案,但檔案開啟過多會導致系統執行緩慢,這時就要自行手動關閉不再使用的檔案,來提高系統整體的執行效率。

例1. 開啟檔案並進行判斷和關閉檔案

file *fp;

fp = fopen(「c:\temp\test.txt」, 「r」);

if(fp == null)

printf(「fail to open the file! \n」);

else

2.3 字元訪問函式

函式原型為:

_crtimp int __cdecl fputc(int, file *);

_crtimp int __cdecl fgetc(file *);

字元讀取函式fgetc()可從檔案資料流中一次讀取乙個字元,然後讀取游標移動到下乙個字元,並逐步將檔案的內容讀出。

如果字元讀取成功,則返回所讀取的字元,否則返回eof(end of file)。eof是表示資料結尾的常量,真值為-1。另外,要判斷檔案是否讀取完畢,可利用feof()進行檢查。未完返回0,已完返回非零值。

feof()函式原型為:_crtimp int __cdecl feof(file *);

例2. fgetc()函式的使用

版本1:利用feof()函式檢查檔案是否讀取完畢

#include

main()

else

printf(「fail to open! \n」);

fclose(fp);

return 0;
版本2:利用檔案結束標誌eof(即-1)

#include

main()

}

else

printf("fail to open! \n");

fclose(fp);

return 0;

版本3 - 重構版本2

#include

main()

fclose(fp);

return 0;
2.4 字串訪問函式

函式原型為:

_crtimp int __cdecl fputs(const char *, file *);

_crtimp char * __cdecl fgets(char *, int, file *);

fgets函式的作用是從指定檔案讀入乙個字串,如:fgets(str, n, fp);

引數n為要求得到的字元個數,但只從fp指向的檔案輸入n-1個字元,然後在最後加乙個』\0』字元,因此得到的字串共有n個字元,把它們放在字元陣列str中。如果在讀完n-1個字元之前遇到換行符或eof,讀入結束。

fputs函式的作用是向指定檔案輸出乙個字串,如:fputs(「hey」, fp);

把字串"hey"輸出到fp指向的檔案。fputs函式的第乙個引數可以是字串常量、字元陣列名或字元型指標。若輸出成功,則返回0,否則返回eof。

例項略2.5 格式化訪問函式

函式原型為:

_crtimp int __cdecl fprintf(file *, const char *, …);

_crtimp int __cdecl fscanf(file *, const char *, …);

它們與printf和scanf函式相仿,都是格式化讀寫函式。不同的是:fprintf和fscanf函式的讀寫物件不是終端(標準輸入輸出),而是磁碟檔案。printf函式是將內容輸出到終端(螢幕),因此,fprintf就是將內容輸出到磁碟檔案了。

例項4. fprintf和fscanf函式的使用

#include

void main()

gender;

typedef struct

person;

void write2file(person emp[size])

for(int i=0; ivoid read_from_file(file *fp)

printf("\n%d employee's information read: \n", size);

for(int i=0; ivoid main()

{file *fp = null;

person employee[size];

printf("enter %d employee's information: \n", size);

for(int i=0; i3.2 隨機訪問函式fseek()

函式原型:

_crtimp int __cdecl fseek(file *, long, int);

對流式檔案可以進行順序讀寫,也可以進行隨機讀寫。關鍵在於控制檔案的位置指標,如果位置指標是按位元組位置順序移動的,就是順序讀寫。如果能將位置指標按需要移動到任意位置,就可以實現隨機讀寫。所謂隨機讀寫,是指讀完上乙個字元(位元組)後,並不一定要讀寫其後續的字元(位元組),而可以讀寫檔案中任意位置上所需要的字元(位元組)。該函式的呼叫形式為:

fseek(fp, offset, start);

start:起始點。用0、1、2代替。0代表檔案開始,名字為seek_set,1代表當前位置,名字為seek_cur,2代表檔案末尾,名字為seek_end。

fseek()函式一般用於二進位制檔案,因為文字檔案要發生字元轉換,計算位置時往往會發生混亂。

呼叫實例如:

fseek(fp, i*sizeof(person), 0);

C 檔案操作 File類

file類的常用靜態方法表 方 法 說 明 create 在指定路徑中建立檔案 delete 刪除指定的檔案 exists 判斷指定的檔案是否存在 open 開啟指定路徑上的檔案 openread 開啟檔案以進行讀取 openwrite 開啟檔案以進行寫入 move 將指定檔案移到新位置 copy ...

C語言檔案訪問 FILE

近期學習c語言如何訪問檔案,看了幾篇博文,感覺挺不錯,向大家推薦一下。對上面文章的補充說明 a 以附加的方式開啟只寫檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾,即檔案原先的內容會被保留。檔案中有 for int i 0 i一位園友指出下面的錯誤,本人不太了解這方面的知...

c語言檔案操作詳解

什麼是檔案?磁碟上的檔案是檔案,但是在程式設計中,我們一般談的檔案有兩種 程式檔案,資料檔案。在這裡插入 片1 程式檔案 包括源程式檔案 字尾為.c 目標檔案 windows環境字尾為.obj 可執行程式 windows環境字尾為.exe 2 資料檔案 檔案的內容不一定是程式,而是程式執行時讀寫的資...