unix環境高階程式設計 標準IO

2021-07-15 15:28:11 字數 3771 閱讀 6295

標準io庫:

不僅在unix上,在很多作業系統上都實現了標準的io庫,它處理了很多細節,例如緩衝區分配,優化長度執行io等。

流和file物件:

對於標準的io庫,它們的操作是圍繞流(stream)進行的。當用標準io庫開啟或建立乙個檔案時,已經使乙個流和乙個檔案相關聯,標準的io檔案流可用於單位元組和多位元組字符集,流的定向決定了所讀。所寫的字元是單位元組還是多位元組的,當乙個流最初被建立,並沒有定向,若在乙個未定向的流上使用乙個多位元組io函式,則將該流的定向設定為寬定向,若在未定向的流上使用單位元組io函式,則流定向為位元組定向的。只有兩個函式能夠改變流的定向,freopen清除乙個流的定向,fwide函式設定流的定向。

當開啟乙個流時,標準io函式fopen返回乙個指向file物件的指標,該物件通常是乙個結構,包含了標準io庫為管理該流需要的所有資訊,包括用於實際io檔案描述符、指向用於該緩衝區的指標、緩衝區的長度、當前在緩衝區的字元數等。

應用程式沒有必要檢驗file物件,為了引用乙個流,需將file指標作為引數傳遞給每個標準io函式,稱指向file物件的指標為檔案指標。

標準輸入,標準輸出和標準出錯:

對乙個程序預定義了三個流,可以自動被程序使用,,這三個標準io流通過預定義檔案指標stdin,stdout和stderr加以引用,這三個指標同樣定義在標頭檔案中。

緩衝:標準io庫提供緩衝的目的是盡可能減少使用read和write呼叫的次數,對io流自動進行緩衝管理。

標準io提供三種型別的緩衝:

1.全緩衝,這種情況下,填滿io緩衝區才能進行實際io操作,在乙個流上進行第一次io操作,相關標準io函式通常呼叫malloc獲取緩衝區

2.行緩衝,當輸入和輸出遇到換行符,執行io操作,當流涉及到乙個終端時,通常使用行緩衝。

3.不帶緩衝,標準庫不對字元進行緩衝儲存

標準出錯是不帶緩衝的,開啟至終端裝置的是行緩衝的,其他流是全緩衝的。

更改緩衝型別:

這些函式一定要在流已被開啟的後呼叫,setbuf函式開啟或關閉緩衝機制,使用setvbuf,可以精確的指定所需的緩衝型別,這是用mode引數實現的

_iofbf

_iolbf

_ionbf

下表是兩個函式的引數和動作:

任何時候都可以強制沖洗乙個流:

此函式可以使得該流所有未寫的資料都被傳送至核心,作為一種特殊情形,如果fp是null,則該函式將導致所有輸出被沖洗。

開啟流:

三個函式可開啟乙個標準io流

三個函式的區別

1.fopen開啟乙個指定檔案

2.freopen在乙個指定的流上開啟乙個指定的檔案,該函式一般用於將乙個指定的檔案開啟為乙個預定義的流:標準輸入、標準輸出或標準出錯

3 fdopen 獲取乙個現有的檔案描述符,並使乙個標準的io流與該描述符相結合,此函式常用於由建立管道和網路通訊通道函式返回的描述符,因為這些特殊型別檔案不能用標準io fopen函式開啟,所以必須先呼叫裝置專用函式以獲得乙個檔案描述符,然後用fdopen使乙個標準io流與該描述符相關聯。

type引數指定對該io流的讀寫方式,規定type有15種不同的值,如下表

對應上表,下表列出了開啟乙個流的6種不同的方式:

呼叫flcose關閉乙個開啟的流

在檔案被關閉之前,沖洗緩衝中的輸出資料,緩衝區的任何輸入資料被丟棄,如果標準io庫已經為該流自動分配了乙個緩衝區,則釋放該緩衝區。

當乙個程序正常終止時,則所有帶有未寫緩衝資料的標準io流都被沖洗,所有開啟的標準io流都被關閉。

讀和寫流:

一旦開啟了流,可在三種不同型別的非格式化io中進行選擇。

1.每次乙個字元的io,一次讀或寫乙個字元,如果流是帶緩衝的,則標準io會處理所有緩衝。

2.每次一行的io,想要一次讀或寫一行,則使用fgets和fputs,每行以換行符終止,

3.直接io,fread和fwrite函式支援這種型別的io,這兩個函式常用於從二進位制檔案中每次讀或寫乙個結構。

輸入函式:以下三個函式,可用於一次讀乙個字元

輸出函式:對應這三個輸入函式

每次一行io:

兩個函式都指定了緩衝區位址,讀入的行將送入其中,gets從標準輸入讀,fgets從指定流讀。

對於fgets,必須指定緩衝區的長度n,此函式一直讀到下乙個換行符為止,但是不超過n-1個字元,讀入送入緩衝區,緩衝區以null字元結尾。

gets不推薦使用,因為不能指定緩衝區的長度,容易溢位。

二進位制io:

更願意一次讀或寫整個結構,必須迴圈通過整個結構,提供兩個函式進行io操作:

這兩個函式有兩種常見用法:

1. 讀或寫乙個二進位制陣列

2.讀或寫乙個結構

這兩個函式返回讀或寫的物件數,對於讀,如果出錯或到達檔案尾端,則此數字可以少於nobj,在這種情況,應該呼叫ferror或feof以判斷究竟是哪種情況,對於寫,如果返回值少於要求的nobj,則出錯。

定位流:

有三種方法定位標準io流:

1. ftell和fseek函式

2.ftello和fseeko函式

3.fgetpos和fsetpos函式

格式化io(printf scanf):

格式化輸出:

printf將格式化資料寫到標準輸出,fprintf寫到指定的流,dprintf輸出到指定檔案描述符,sprintf將格式化的字元送入陣列buf中。

格式化輸入:

三個scanf函式

scanf族用於分析輸入字串,並將字串序列轉換成指定型別的變數。

臨時檔案:標準io庫提供了兩個函式以幫助建立臨時檔案

記憶體流:

標準io庫把資料快取在記憶體中,因此每次一字元和每次一行的io更有效。也可以通過呼叫setbuf或setvbuf函式讓io庫使用自己的緩衝區

三個函式可用於記憶體流的建立,第乙個是fmemopen函式

#include

fife *fmemopen(void *restrict buf, size_t size, const char *restrict type);

允許呼叫者提供緩衝區用於記憶體流,buf引數指向快取區開始位置,size引數指定了緩衝區大小的位元組數。

其他兩個函式分別是,open_memstream和open_wmemstream

UNIX 環境高階程式設計 標準IO 未完

函式原型 file fopen const char path,const char mode 函式功能 開啟乙個檔案 函式引數 path 字串包含欲開啟的檔案路徑及檔名 mode 字串則代表著流形態。包含下面的幾種模式 mode有下列幾種形態字串 r 以唯讀方式開啟檔案,該檔案必須存在。r 以可讀...

Unix環境高階程式設計 三 標準I O庫

標準i o庫是iso c的標準,在很多作業系統上面都實現。unix檔案i o函式都是針對檔案描述符的,當開啟乙個檔案的時候,返回該檔案描述符用於後續的i o操作。而對於標準i o庫,操作則是圍繞流進行,當用標準i o庫開啟或者建立乙個檔案時,使得乙個流與檔案相關聯。標準i o庫使用了緩衝技術,使用緩...

《UNIX環境高階程式設計》 I O

不帶緩衝i o open read write lseek close等 標準i o 帶緩衝 fopen fclose fgets fputs fgetc fputc fwrite fread 標準i o對每個i o流自動進行快取管理 標準i o函式通常呼叫malloc來分配快取 它提供了三種型別的...