4.清除和設(shè)置文件緩沖區(qū)
(1).清除文件緩沖區(qū)函數(shù):
int fflush(FILE *stream);
int flushall();
fflush()函數(shù)將清除由stream指向的文件緩沖區(qū)里的內(nèi)容,常用于寫完一些數(shù)據(jù)后,立即用該函數(shù)清除緩沖區(qū),以免誤操作時(shí),破壞原來(lái)的數(shù)據(jù)。
flushall()將清除所有打開文件所對(duì)應(yīng)的文件緩沖區(qū)。
(2).設(shè)置文件緩沖區(qū)函數(shù)
void setbuf(FILE *stream,char *buf);
void setvbuf(FILE *stream,char *buf,int type,unsigned size);
這兩個(gè)函數(shù)將使得打開文件后,用戶可建立自己的文件緩沖區(qū),而不使用fopen()函數(shù)打開文件設(shè)定的默認(rèn)緩沖區(qū)。
對(duì)于setbuf()函數(shù),buf指出的緩沖區(qū)長(zhǎng)度由頭文件stdio.h中定義的宏BUFSIZE的值決定,缺省值為512字節(jié)。當(dāng)選定buf為空時(shí),setbuf函數(shù)將使的文件I/O不帶緩沖。而對(duì)setvbuf函數(shù),則由malloc函數(shù)來(lái)分配緩沖區(qū)。參數(shù)size指明了緩沖區(qū)的長(zhǎng)度(必須大于0),而參數(shù)type則表示了緩沖的類型,其值可以取如下值:
type 值 含義
_IOFBF 文件全部緩沖,即緩沖區(qū)裝滿后,才能對(duì)文件讀寫
_IOLBF 文件行緩沖,即緩沖區(qū)接收到一個(gè)換行符時(shí),才能對(duì)文件讀寫
_IONBF 文件不緩沖,此時(shí)忽略buf,size的值,直接讀寫文件,不再經(jīng)過文件緩沖區(qū)緩沖
5.文件的隨機(jī)讀寫函數(shù)
前面介紹的文件的字符/字符串讀寫,均是進(jìn)行文件的順序讀寫,即總是從文件的開頭開始進(jìn)行讀寫。這顯然不能滿足我們的要求,C語(yǔ)言提供了移動(dòng)文件指針和隨機(jī)讀寫的函數(shù),它們是:
(1).移動(dòng)文件指針函數(shù):
long ftell(FILE *stream);
int rewind(FILE *stream);
fseek(FILE *stream,long offset,int origin);
函數(shù)ftell()用來(lái)得到文件指針離文件開頭的偏移量。當(dāng)返回值是-1時(shí)表示出錯(cuò)。
rewind()函數(shù)用于文件指針移到文件的開頭,當(dāng)移動(dòng)成功時(shí),返回0,否則返回一個(gè)非0值。
fseek()函數(shù)用于把文件指針以origin為起點(diǎn)移動(dòng)offset個(gè)字節(jié),其中origin指出的位置可有以下幾種:
origin 數(shù)值 代表的具體位置
SEEK_SET 0 文件開頭
SEEK_CUR 1 文件指針當(dāng)前位置
SEEK_END 2 文件尾
例如:
fseek(fp,10L,0);
把文件指針從文件開頭移到第10字節(jié)處,由于offset參數(shù)要求是長(zhǎng)整型數(shù),故其數(shù)后帶L。
fseek(fp,-15L,2);
把文件指針從文件尾向前移動(dòng)15字節(jié)。
(2).文件隨機(jī)讀寫函數(shù)
int fread(void *ptr,int size,int nitems,FILE *stream);
int fwrite(void *ptr,int size,int nitems,FILE *stream);
fread()函數(shù)從流指針指定的文件中讀取nitems個(gè)數(shù)據(jù)項(xiàng),每個(gè)數(shù)據(jù)項(xiàng)的長(zhǎng)度為size個(gè)字節(jié),讀取的nitems數(shù)據(jù)項(xiàng)存入由ptr指針指向的內(nèi)存緩沖區(qū)中,在執(zhí)行fread()函數(shù)時(shí),文件指針隨著讀取的字節(jié)數(shù)而向后移動(dòng),最后移動(dòng)結(jié)束的位置等于實(shí)際讀出的字節(jié)數(shù)。該函數(shù)執(zhí)行結(jié)束后,將返回實(shí)際讀出的數(shù)據(jù)項(xiàng)數(shù),這個(gè)數(shù)據(jù)項(xiàng)數(shù)不一定等于設(shè)置的nitems,因?yàn)槿粑募袥]有足夠的數(shù)據(jù)項(xiàng),或讀中間出錯(cuò),都會(huì)導(dǎo)致返回的數(shù)據(jù)項(xiàng)數(shù)少于設(shè)置的nitems。當(dāng)返回?cái)?shù)不等于nitems時(shí),可以用feof()或ferror()函數(shù)進(jìn)行檢查。
fwrite()函數(shù)從ptr指向的緩沖區(qū)中取出長(zhǎng)度為size字節(jié)的nitems個(gè)數(shù)據(jù)項(xiàng),寫入到流指針stream指向的文件中,執(zhí)行該操作后,文件指針將向后移動(dòng),移動(dòng)的字節(jié)數(shù)等于寫入文件的字節(jié)數(shù)目。該函數(shù)操作完成后,也將返回寫入的數(shù)據(jù)項(xiàng)數(shù)。
二、非標(biāo)準(zhǔn)文件的讀寫
這類函數(shù)最早用于UNIX操作系統(tǒng),ANSI標(biāo)準(zhǔn)未定義,但有時(shí)也經(jīng)常用到,DOS 3.0以上版本支持這些函數(shù)。它們的頭文件為io.h。
由于我們不常用這些函數(shù),所以在這里就簡(jiǎn)單說一下。
1.文件的打開和關(guān)閉
open()函數(shù)的作用是打開文件,其調(diào)用格式為:
int open(char *filename, int access);
該函數(shù)表示按access的要求打開名為filename的文件,返回值為文件描述字,其中access有兩部分內(nèi)容:
基本模式和修飾符, 兩者用 (或)方式連接。修飾符可以有多個(gè), 但基本模式只能有一個(gè)。
access的規(guī)定
--------------------------------------------------------
基本模式 含義 修飾符 含 義
--------------------------------------------------------
O_RDONLY 只讀 O_APPEND 文件指針指向末尾
O_WRONLY 只寫 O_CREAT 文件不存在時(shí)創(chuàng)建文件, 屬性按基本模式屬性
O_RDWR 讀寫 O_TRUNC 若文件存在, 將其長(zhǎng)度縮為0, 屬性不變
O_BINARY 打開一個(gè)二進(jìn)制文件
O_TEXT 打開一個(gè)文字文件
---------------------------------------------------------
open()函數(shù)打開成功, 返回值就是文件描述字的值(非負(fù)值), 否則返回-1。
close()函數(shù)的作用是關(guān)閉由open()函數(shù)打開的文件, 其調(diào)用格式為:
int close(int handle);
該函數(shù)關(guān)閉文件描述字handle相連的文件。
2.讀寫函數(shù)
int read(int handle, void *buf, int count);
read()函數(shù)從handle(文件描述字)相連的文件中, 讀取count個(gè)字節(jié)放到buf所指的緩沖區(qū)中,
返回值為實(shí)際所讀字節(jié)數(shù), 返回-1表示出錯(cuò)。返回0 表示文件結(jié)束。
write()函數(shù)的調(diào)用格式為:
int write(int handle, void *buf, int count);
write()函數(shù)把count個(gè)字節(jié)從buf指向的緩沖區(qū)寫入與handle相連的文件中, 返回值為實(shí)際寫入的字節(jié)數(shù)。
3.隨機(jī)定位函數(shù)
lseek()函數(shù)的調(diào)用格式為:
int lseek(int handle, long offset, int fromwhere);
該函數(shù)對(duì)與handle相連的文件位置指針進(jìn)行定位,功能和用法與fseek()函數(shù)相同。
tell()函數(shù)的調(diào)用格式為:
long tell(int handle);
該函數(shù)返回與handle相連的文件現(xiàn)生位置指針, 功能和用法與ftell()相同。
相關(guān)推薦:計(jì)算機(jī)等級(jí)考試二級(jí)C語(yǔ)言教程匯總計(jì)算機(jī)等級(jí)考試二級(jí)C語(yǔ)言常見知識(shí)點(diǎn)總結(jié)
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |