UNIX環境程式設計學習 標準IO庫

2021-10-03 18:36:50 字數 4445 閱讀 8432

在檔案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流被預定義為檔案指標stdinstdoutstderr

緩衝緩衝是標準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...