在檔案io中,所有的函式都是使用檔案描述符作為讀寫的物件。但在標準i/o庫中,函式的操作物件是乙個流(stream)。當用標準i/o庫開啟乙個檔案時,就會使乙個stream與該檔案繫結。
流的定向
流的定向可以看作是流的乙個屬性。它決定了流所進行的讀取或寫入操作是單位元組還是多位元組(在國際字符集中乙個字元可用多個位元組表示)。流建立的時候並不存在定向,對於它的第乙個操作將賦予它對應的定向。流的定向是可以改變的,改變的函式有freopen()
(可以清除乙個流的定向)與fwide()
(可以設定乙個流的定向)
#include
#include
intfwide
(fife *fp,
int mode)
;//返回值:若流為寬定向,返回正值,若流為位元組定向,返回負值,若流未定向,返回0
可以看出,fwide
函式可以也用來判斷流的定向,其中mode的引數設定如下:
file物件
當開啟乙個流時,標準i/o函式(如fopen()
)將返回乙個指向fife物件的指標,該型別的指標稱為檔案指標。該指標通常是乙個結構,它包含流標準i/o庫為管理該流所需要的資訊,如實際用於讀寫操作的檔案描述符,指向用於該流的緩衝區的指標,緩衝區的長度,當前在緩衝區的字元數以及出錯標誌等等。
標準輸入流,標準輸出流,標準錯誤流
對於乙個程序都會預定義3個流用於標準輸入,標準輸出與標準錯誤。這3個標準i/o流被預定義為檔案指標stdin
,stdout
,stderr
。
緩衝緩衝是標準i/o庫與檔案i/o系統呼叫的最大區別。標準i/o庫提供緩衝的目地便是減少使用read與write呼叫的次數。它能對每個i/o流自動地進行緩衝管理。
標準i/o庫提供了3種型別的緩衝:
對於緩衝的設定,也有對應的函式。
#include
void
setbuf
(file *fp,
char
*buf)
;int
setvbuf
(file *fp,
char
*buf,
int mode,size_t size)
;
對於這兩個函式的詳細用法,可參照man page。
任何時候我們均可以呼叫以下函式來進行緩衝區的flush:
#include
intfflush
(file *fp)
;
開啟或關閉流#include
file *
fopen
(const
char
*pathname,cosnt char
*type)
;file *
freopen
(const
char
*pathname,cosnt char
*type,file *fp)
;file *
fdopen
(int fd,
const
char
*type)
;//返回值:成功返回檔案指標,失敗返回null
#include
intfclose
(file *fp)
;//返回值,若成功則返回0,出錯返回eof
說明:
對於type值的指定,有如下幾項:
讀、寫流
一般的讀寫分為3種方式:
第一種讀寫(單字元i/o):
#incldue
//輸入函式
intgetc
(file *fp)
;int
fgetc
(file *fp)
;int
getchar
(void);
//相當於getc(stdin)
//返回值:成功則返回讀取的字元,若已到達檔案尾端或出錯,返回eof
o//乙個特殊的函式:
intungetc
(int c,file *fp)
;//將乙個字元壓回緩衝區
//輸出函式
intputc
(int c,file *fp)
;int
fputc
(int c,file *fp)
;int
putchar
(int c)
;//返回值:成功返回c,錯誤返回eof
一些注意事項:
第二種讀寫(行i/o):
#inlcude
//讀取函式(輸入函式)
char
*fgets
(char
*restrict buf ,
int n ,file *restrict fp)
;char
*gets
(char
*buf)
;//輸出函式
intfputs
(const
char
*restrict str,file *restrict fp)
;int
puts
(const cahr *str)
第三種讀寫(二進位制i/o)
#include
size_t fread
(void
*restrict ptr,size_t size,size_t nobj,file *restrict fp)
;size_t fwrite
(const
void
*restrict ptr,size_t size,size_t nobj,file *restrict fp)
;
流的定位#inlcude
long
ftell
(file *fp)
;//返回值:若成功,返回當前檔案位置指示;若出錯,返回-1l
intfseek
(file *fp,
long offset,
int whence)
;//返回值,若成功返回0,失敗返回-1
void
rewind
(file *fp)
;
whence的值如下
格式化io
#include
//格式化輸出函式
intprintf
(const
char
*restrict format,..
.);int
fprintf
(file *restrict fp,
const
char
*restrict format,..
.);int
dprintf
(int fd,
const
char
*restrict format,..
.);//以上三個函式成功返回輸出字元數,出錯返回負值。
intsprintf
(char
* restrict fp,
const
char
*restrict format,..
.)intsnprintf
(char
* restrict fp,size_t n,
const
char
*restrict format,..
.)//成功返回存入陣列的字元數,編碼錯誤返回負值
//格式化輸入函式
intscanf
(const
char
*restrict format,..
.);int
fscanf
(file *restrict fp,
const
char
*restrict format,..
.);int
sscanf
(const
char
*restrict buf,
const
char
*restrict format,..
.);
printf函式將格式化資料寫到標準輸出,fprintf寫到指定的流,dprintf函式寫到指定的檔案描述符,sprintf將格式化的字元送入陣列buf中。sprintf在該陣列的尾端自動加乙個null位元組,但該字元不包括在返回值中。
獲取檔案描述符
#include
intfileno
(file *fp)
;
小結: Unix環境高階程式設計 三 標準I O庫
標準i o庫是iso c的標準,在很多作業系統上面都實現。unix檔案i o函式都是針對檔案描述符的,當開啟乙個檔案的時候,返回該檔案描述符用於後續的i o操作。而對於標準i o庫,操作則是圍繞流進行,當用標準i o庫開啟或者建立乙個檔案時,使得乙個流與檔案相關聯。標準i o庫使用了緩衝技術,使用緩...
unix環境高階程式設計 標準IO
標準io庫 不僅在unix上,在很多作業系統上都實現了標準的io庫,它處理了很多細節,例如緩衝區分配,優化長度執行io等。流和file物件 對於標準的io庫,它們的操作是圍繞流 stream 進行的。當用標準io庫開啟或建立乙個檔案時,已經使乙個流和乙個檔案相關聯,標準的io檔案流可用於單位元組和多...
UNIX環境高階程式設計學習筆記三 標準I O庫的介紹
include include intfwid file fp,int mode 指定流寬頻 void setbuf file restrict fp,char restrict buf 開啟或關閉緩衝機制 void setvbuf file restrict fp,char restrict bu...