題目:用setvbuf實現(xiàn)setbuf。
這兩個函數(shù)都是改變流的緩沖模式的。函數(shù)原型如下:
#include <stdio.h>
void setbuf(FILE *fp, char *buf);
void setvbuf(FILE *fp, char *buf, int mode, size_t size);
毫無疑問,setvbuf是setbuf的升級版。下面我們再看看這兩個函數(shù)是怎么工作的:

setbuf只能決定打開或者關(guān)閉緩沖(設(shè)buf為NULL則關(guān)閉),而是行緩沖還是全緩沖則決定與fp是否與終端設(shè)備相關(guān)。
setvbuf則更加詳細,可以自由選擇緩沖類型而緩沖區(qū)的大小(圖上合適長度的系統(tǒng)緩沖區(qū)則就是本身就有定義的BUFSIZ)
要注意的是:使用這兩個函數(shù)應(yīng)該是在打開流之后和使用流之前。
下面給出我實現(xiàn)的代碼,看了之后應(yīng)該也很容易理解:

1 /* 用setvbuf來實現(xiàn)setbuf */ 2 #include <stdio.h> 3 #include <stdlib.h> 4 5 void PR_stdio(const char *, FILE *); 6 void my_setbuf(FILE *, char *); 7 8 int main(void) 9 {10 char buf[BUFSIZ];11 char filename[BUFSIZ];12 FILE *fp;13 14 printf("Please input a filename:");15 scanf(" %s", filename);16 17 if ((fp = fopen(filename, "r")) == NULL) /* 打開文件 */18 {19 printf("fopen error");20 exit(1);21 }22 23 pr_stdio(filename, fp); /* 查看是什么緩沖,一般是全緩沖 */24 25 if (fp->_IO_file_flags &_IO_UNBUFFERED ) /* 文件流是無緩沖的,調(diào)成有緩沖 */26 my_setbuf(fp, buf);27 else /* 文件流是有緩沖的,調(diào)成無緩沖 */28 my_setbuf(fp, NULL); 29 30 printf("After setbuf.../n");31 pr_stdio(filename, fp); /* 關(guān)閉了緩沖 */32 33 return 0; 34 }35 36 void pr_stdio(const char *pathname, FILE *fp)37 {38 printf("stream = %s, ", pathname);39 40 if (fp->_IO_file_flags & _IO_UNBUFFERED) /* 無緩沖 */41 printf("unbuffered/n");42 else if (fp->_IO_file_flags & _IO_LINE_BUF) /* 行緩沖 */43 printf("line buffered/n");44 else /* 全緩沖 */45 printf("fully buffered/n");46 }47 48 void my_setbuf(FILE *fp, char *buf) /* setbuf函數(shù),要么打開,要么關(guān)閉,是全緩沖還是行緩沖決定于fp */49 {50 int fd;51 52 fd = fileno(fp); /* 獲取文件描述符 */53 54 if (buf == NULL) /* 修改為無緩沖 */55 {56 setvbuf(fp, buf, _IONBF, BUFSIZ);57 return;58 }59 60 if (fd == 0 || fd == 1 || fd == 2) /* 與終端設(shè)備相關(guān),應(yīng)設(shè)為行緩沖 */61 setvbuf(fp, buf, _IOLBF, BUFSIZ);62 else /* 設(shè)為全緩沖 */63 setvbuf(fp, buf, _IOFBF, BUFSIZ);64 65 }View Code結(jié)果如下:

新聞熱點
疑難解答