下列三個(gè)函數(shù)打開(kāi)一個(gè)標(biāo)準(zhǔn)I/O流。
#include <stdio.h>FILE *fopen( const char *restrict pathname, const char *restrict type );FILE *freopen( const char *restrict pathname, const char *restrict type, FILE *restrict fp );FILE *fdopen( int filedes, const char *type );三個(gè)函數(shù)的返回值:若成功則返回文件指針,若出錯(cuò)則返回NULL
這三個(gè)函數(shù)的區(qū)別是:
(1)fopen打開(kāi)一個(gè)指定的文件。
(2)freopen在一個(gè)指定的流上打開(kāi)一個(gè)指定的文件,如若該流已經(jīng)打開(kāi),則先關(guān)閉該流。若該流已經(jīng)定向,則freopen清除該定向。此函數(shù)一般用于將一個(gè)指定的文件打開(kāi)為一個(gè)預(yù)定義的流:標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出或標(biāo)準(zhǔn)出錯(cuò)。
(3)fdopen獲取一個(gè)現(xiàn)有的文件描述符(我們可能從open、dup、dup2、fcntl、pipe、socket、socketpair或accept函數(shù)得到此文件描述符),并使一個(gè)標(biāo)準(zhǔn)的I/O流與該描述符相結(jié)合。此函數(shù)常用于由創(chuàng)建管道和網(wǎng)絡(luò)通信通道函數(shù)返回的描述符。因?yàn)檫@些特殊類(lèi)型的文件不能用標(biāo)準(zhǔn)I/O fopen函數(shù)打開(kāi),所以我們必須先調(diào)用設(shè)備專(zhuān)用函數(shù)以獲得一個(gè)文件描述符,然后用fdopen使一個(gè)標(biāo)準(zhǔn)I/O流與該描述符相關(guān)聯(lián)。
type參數(shù)指定對(duì)該I/O流的讀、寫(xiě)方式,ISO C規(guī)定type參數(shù)可以有15種不同的值,見(jiàn)表5-2。
使用字符b作為type的一部分,這使得標(biāo)準(zhǔn)I/O系統(tǒng)可以區(qū)分文本文件和二進(jìn)制文件。因?yàn)閁NIX內(nèi)核并不對(duì)這兩種文件進(jìn)行區(qū)分,所以在UNIX系統(tǒng)環(huán)境下指定字符b作為type的一部分實(shí)際上并無(wú)作用。
對(duì)于fdopen,type參數(shù)的意義稍有區(qū)別。因?yàn)樵撁枋龇驯淮蜷_(kāi),所以fdopen為寫(xiě)而打開(kāi)并不截短該文件。另外,標(biāo)準(zhǔn)I/O添寫(xiě)方式也不能用于創(chuàng)建該文件(因?yàn)槿缛粢粋€(gè)描述符引用一個(gè)文件,則該文件一定已經(jīng)存在)。
當(dāng)用添寫(xiě)方式打開(kāi)一文件后,則每次寫(xiě)都將數(shù)據(jù)寫(xiě)到文件的當(dāng)前尾端處。如若有多個(gè)進(jìn)程用標(biāo)準(zhǔn)I/O添寫(xiě)方式打開(kāi)了同一文件,那么來(lái)自每個(gè)進(jìn)程的數(shù)據(jù)都將正確地寫(xiě)到文件中。
當(dāng)以讀和寫(xiě)類(lèi)型打開(kāi)一文件時(shí)(type中+符號(hào)),具有下列限制:
如果中間沒(méi)有fflush、fseek、fsetpos或rewind,則在輸出的后面不能直接跟隨輸入。
如果中間沒(méi)有fseek、fsetpos或rewind,或者一個(gè)輸入操作沒(méi)有到達(dá)文件尾端,則在輸入操作之后不能直接跟隨輸出。
對(duì)應(yīng)于表5-2,我們?cè)诒?-3中列出了打開(kāi)一個(gè)流的6種不同的方式。
表5-3 打開(kāi)一個(gè)標(biāo)準(zhǔn)I/O流的6種不同的方式
限制 | r | w | a | r+ | w+ | a+ |
文件必須已存在 | @ | @ | ||||
擦除文件以前的內(nèi)容 | @ | @ | ||||
流可以讀 | @ | @ | @ | @ | ||
流可以寫(xiě) | @ | @ | @ | @ | @ | |
流只可在尾端寫(xiě) | @ | @ |
注意,在指定w或a類(lèi)型創(chuàng)建一個(gè)新文件時(shí),我們無(wú)法說(shuō)明該文件的訪問(wèn)權(quán)限位。
除非流引用終端設(shè)備,否則按系統(tǒng)默認(rèn)的情況,流被打開(kāi)時(shí)是全緩沖的。若流引用終端設(shè)備,則該流是行緩沖的。一旦打開(kāi)了流,那么在對(duì)該流執(zhí)行任何操作之前,如果希望,則可使用setbuf和setvbuf改變緩沖的類(lèi)型。
調(diào)用fclose關(guān)閉一個(gè)打開(kāi)的流。
#include <stdio.h>int fclose( FILE *fp );返回值:若成功則返回0,若出錯(cuò)則返回EOF
在該文件被關(guān)閉之前,沖洗緩沖區(qū)中的輸出數(shù)據(jù)。丟棄緩沖區(qū)中的任何輸入數(shù)據(jù)。如果標(biāo)準(zhǔn)I/O庫(kù)已經(jīng)為該流自動(dòng)分配了一個(gè)緩沖區(qū),則釋放此緩沖區(qū)。
當(dāng)一個(gè)進(jìn)程正常終止時(shí)(直接調(diào)用exit函數(shù),或從main函數(shù)返回),則所有帶未寫(xiě)緩沖數(shù)據(jù)的標(biāo)準(zhǔn)I/O都會(huì)被沖洗,所有打開(kāi)的標(biāo)準(zhǔn)I/O流都會(huì)被關(guān)閉。
本篇博文內(nèi)容摘自《UNIX環(huán)境高級(jí)編程》(第二版),僅作個(gè)人學(xué)習(xí)記錄所用。關(guān)于本書(shū)可參考:http://www.apuebook.com/。
新聞熱點(diǎn)
疑難解答
圖片精選