背景
之前在linux下手寫c語言日志庫的時候,遇到日志內容無法及時刷新的情況,百思不得其解;最后查資料才知道是默認的緩沖區設置的問題。‘
與之相關的緩沖區設置函數有setbuf和setvbuf
分析
緩沖區分類:1.行緩沖 2.全緩沖 3.無緩沖
行緩沖特點是:
- 默認大小:1024字節;
- 遇換行符或緩沖區滿時,將刷新緩沖區;
比如,標准輸入輸出就是行緩沖類型。
全緩沖特點是:
- 默認大小:4096字節;
- 緩沖區滿時,將刷新緩沖區;
比如,普通文件讀寫緩沖區就是全緩沖類型。
無緩沖特點是直接調用系統IO刷新緩沖區,比如標准錯誤的緩沖區
磁盤文件緩沖區
通過setbuf和setvbuf函數,可以對文件緩沖區類型和大小進行修改。
測試代碼
#include <stdio.h> #include <stdlib.h> int main() { int i; FILE *fp; char msg[] = "hello,world\n"; char buf[128]; if((fp = fopen("setbuf_nobuff.txt","w")) == NULL) { perror("file open fail"); exit(-1); } setbuf(fp,NULL); // NO_BUFF fwrite(msg,7,1,fp); printf("test setbuf(NULL)\n"); printf("press enter to continue\n"); getchar(); fclose(fp); if((fp = fopen("setvbuf_ionbf.txt","w")) == NULL) { perror("setvbuf_ionbf.txt"); exit(-1); } setvbuf(fp,NULL,_IONBF,0); fwrite(msg,7,1,fp); printf("test setvbuf(_IONBF)\n"); printf("press enter to continue\n"); getchar(); fclose(fp); if((fp = fopen("setvbuf_iolbf.txt","w")) == NULL) { perror("setvbuf_iolbf.txt"); exit(-1); } setvbuf(fp,buf,_IOLBF,sizeof(buf)); fwrite(msg,sizeof(msg),1,fp); printf("test setvbuf(_IOLBF)\n"); printf("press enter to continue\n"); getchar(); fclose(fp); if((fp = fopen("setvbuf_iofbf.txt","w")) == NULL) { perror("setvbuf_iofbf.txt"); exit(-1); } setvbuf(fp,buf,_IOFBF,sizeof(buf)); for(i = 0;i < 2;i++) { fprintf(fp, msg); } printf("test setbuf(_IOFBF)\n"); printf("press enter to continue\n"); getchar(); fclose(fp); return 0; }