輸入和輸出是通過read和write系統(tǒng)調(diào)用實(shí)現(xiàn)的(調(diào)用系統(tǒng)的功能),在C語言程序中,可以通過函數(shù)read和write訪問這兩個系統(tǒng)調(diào)用.這兩個函數(shù)中,第一個參數(shù)是文件描述符,第二個參數(shù)是程序中存放讀或?qū)憯?shù)據(jù)的字符數(shù)組,第三個參數(shù)是要傳輸?shù)淖止?jié)數(shù).
每個調(diào)用返回實(shí)際傳輸?shù)淖止?jié)數(shù).在讀文件時,函數(shù)的返回值可能會小于請求的字節(jié)數(shù),如果返回值為0,則表示已到達(dá)文件的結(jié)尾:如果返回值為-1,則表示發(fā)生了某種錯誤.在寫文件時,返回值是實(shí)際寫入的字節(jié)數(shù),如果返回值與請求寫入的字節(jié)數(shù)不相等則說明發(fā)生了錯誤.
在單次調(diào)用中,讀出或?qū)懭氲臄?shù)據(jù)的字節(jié)數(shù)可以為任意大小.最常用的值為1,即每次讀出或?qū)懭?個字符(無緩沖),或是類似于1024或4098這樣的與外圍設(shè)備的物理塊大小相應(yīng)的值,用更大的值調(diào)用函數(shù)可以獲得更高的效率,因?yàn)橄到y(tǒng)調(diào)用的次數(shù)少了.
下面那個程序例子懶得寫了,0是標(biāo)準(zhǔn)輸入,1是標(biāo)準(zhǔn)輸出.然后那個重定向是由外面的系統(tǒng)>和<來實(shí)現(xiàn)的.
系統(tǒng)調(diào)用的函數(shù)原型集中放在頭文件syscalls.h中.
BUFSIZ是一個常量,是系統(tǒng)自帶的.如果文件大小不是這個BUFSIZ的倍數(shù)(因?yàn)槊看握{(diào)用都只讀取BUFSIZ個字符,所以最后一次就會返回另一個值,這個值就是最后讀取的字符數(shù)),然后最后一次寫就通過這個值去寫.(然后文件到末尾read返回0,判斷式為假,終止程序.)
getchar函數(shù).
就是通過read向0(標(biāo)準(zhǔn)輸入讀取字符)判斷返回值是否為1(因?yàn)閞ead的第三個參數(shù)每次讀取數(shù)量就是1),如果為1,向調(diào)用getchar的函數(shù)返回讀入的這個c(c必須是變量,用于保存read讀入的字符還因?yàn)閞ead需要地址.).否則返回EOF.
第二個getchar函數(shù)
static對外隱藏數(shù)組和指針.并且在程序運(yùn)行過程中不重置數(shù)組和指針的內(nèi)容.
但是這個程序真的只是返回一個字符的.
read讀取后放入buf數(shù)組中.變量n改變?yōu)椴坏扔?.
return只返回了bufp++那個字符,
之后每次調(diào)用都會從buf數(shù)組中返回值(bufp++是buf數(shù)組的下一個字符).
如果n等于0的話就是緩沖區(qū)中已經(jīng)沒有字符了.所以要將bufp這個遍歷buf數(shù)組的指針初始化為buf開頭的位置.
讀入一組只返回一個不知道在哪能用到.