一.文件io與標準io的一個區別
遇到死循環可以ctrl c結束進程
使用printf輸出,輸出沒有問題
用wirte輸出,參數1,可以理解為上面介紹的linux標準文件描述符的1(STDOUT)標準輸出,我們加上一個死循環while(1);去執行文件發現是可以執行的(把\n去掉),但是用printf去執行就不可以。對于這個問題就引出了接下來要講的緩存
二.緩存
把用戶緩存內容發到內核緩存中有四種方法
1./n
2.滿緩存時(1024字節)
3.系統調用函數
4.fflush函數
三.行緩存fputs
緩存有如下三類,每一類都有所不同
行緩存的原函數和參數
,使用fclose就可以把緩沖區內最后剩余的數據輸出到磁盤文件中,并釋放文件指針和有關
的緩沖區在fclose之前寫一個死循環,這樣子才可以看出效果,因為 使用fclose就可以把緩沖區內最后剩余的數據輸出到磁盤文件中,并釋放文件指針和有關的緩沖區,這回導致緩存沒有滿就把內容存進去了。之后我們可以看出,a.c里面沒有任何內容。
三.fflush函數
在沒有使用fflush函數之前代碼時不能輸出的,使用之后就可以把hello world輸出
把printf換成fputs(“hello world”,stdout)函數,我們不使用fflush也是無法輸出的,但是把標準輸出atdout改成staerr不使用fflush也可以輸出。因為stderr是三類緩存讀寫函數中的無緩存,直接講內容寫到內核中。
用fget讀數據到數組中然后輸出
注意事項
使用fputs函數寫內容到文件a.c中時光標是會移動的,寫完之后光標是在d之后的,用fgets函數獲取內容時,要用fseek函數移動光標到文件頭,不然光標都在末尾了是讀不出什么數據的,fseek函數也可以用rewind函數代替,效果一樣
ftell函數使用
在代碼寫入和獲取執行之后,我們使用ftell函數來顯示一下當前光標所在的位置是哪里,從結果可以之后fgets獲取內容之前光標被rewind移動到了文件開始,fgets函數使用完之后光標又被移到了離文件開始11的位置,也就是d后面。
四.gets與fget
用gets輸入了七字符它存入的也是七個
將gets換成fgets,可以看到我們輸入了六個,但是len是7,這是因為fgets將新的換行符存入緩存中
五.put與fput
接著上面的代碼修改,執行后可以看到內容有個新的換行符輸出
六.fprintf與sprintf
用fprintf把內容輸出到a.c文件中,fprintf是行緩存的函數,如果在return之前加whilie(1);與
fclose(fp);執行代碼的時候會停留在while哪里,這時打開另一個終端去查看a.c里的內容是空的
sprintf是用于將內容寫入到一個數組之中
七.fgetc與fputc
注意fputs與fputc的? 區別
fputc
下不給寫入“\n”,我們去運行發現a.c中沒有內容,給也沒有,這說明fputc又緩存但是不是行緩存
fgetc
八.cat指令
#include<stdio.h>
int main(int argc,char *argv[])
{FILE fp;int nRet=0;if(argc!=2){printf("fail\n");return -1;}fp=fopen(argv[1],"r");//只讀方式打開 if(fp==NULL){PRINTF("open fail\n");return -2;}while(1){nRet = fgetc(fp);//獲取文件中內容if(feof(fp)) //判斷是否一到文件結束(讀取內容完成){break;//跳出while循環}fputc(nRet,stdout);//內容輸出到屏幕}fclose(fp);return 0;
}