為什么要使用setvbuf函數
如果你的內存足夠大,可以把文件IO的BUF設置大一些,這樣每次你用fopen/fread/fwrite/fscanf/fprintf語句的時候,都會在內存里操作,減少內存到磁盤IO讀寫的操作次數,提高系統效率。
如果你的程序的功能涉及到類似數據庫、視頻、音頻、圖像處理等大量需要爆發式磁盤到內存的IO情況下,可以考慮用setvbuf進行優化內存IO,其他情況下可以不考慮,LINUX/WINDOWS會自動處理這些問題。
功 能: 把緩沖區與流相關
用 法: int setvbuf(FILE *stream, char *buf, int type, unsigned size);
參數:stream :指向流的指針 ;
buf : 期望緩沖區的地址;
type : 期望緩沖區的類型:
_IOFBF(滿緩沖):當緩沖區為空時,從流讀入數據。或者當緩沖區滿時,向流寫入數 據。
_IOLBF(行緩沖):每次從流中讀入一行數據或向流中寫入一行數據。
_IONBF(無緩沖):直接從流中讀入數據或直接向流中寫入數據,而沒有緩沖區。
size : 緩沖區內字節的數量。
http://baike.baidu.com/view/1983906.htm
if (setvbuf(input, bufr, _IOFBF, 512) != 0)
是設置 input這個文件流使用 bufr 所指的512個字節作為 input文件的buffer, 當你操作input文件時,數據都會暫存在 bufr 里面,每次讀input時,系統會一次性讀512字節到bufr里暫存。
if (setvbuf(output, NULL, _IOLBF, 132) != 0)
是設置output文件的buffer,這個buffer會由系統自行調用malloc來申請,buffer是按行模式工作的,每行最大132個字節,也就是當你寫output的時候,每寫完一行(遇見\n),就會把整行真正的寫到磁盤文件上,在遇到換行符前,都咱存在系統自動申請的buffer中,而不會寫到真正的磁盤文件上。