題目:用setvbuf實現setbuf。
這兩個函數都是改變流的緩沖模式的。函數原型如下:
#include <stdio.h>
void setbuf(FILE *fp, char *buf);
void setvbuf(FILE *fp, char *buf, int mode, size_t size);
毫無疑問,setvbuf是setbuf的升級版。下面我們再看看這兩個函數是怎么工作的:
setbuf只能決定打開或者關閉緩沖(設buf為NULL則關閉),而是行緩沖還是全緩沖則決定與fp是否與終端設備相關。
setvbuf則更加詳細,可以自由選擇緩沖類型而緩沖區的大?。▓D上合適長度的系統緩沖區則就是本身就有定義的BUFSIZ)
要注意的是:使用這兩個函數應該是在打開流之后和使用流之前。
下面給出我實現的代碼,看了之后應該也很容易理解:
1 /* 用setvbuf來實現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 ) /* 文件流是無緩沖的,調成有緩沖 */26 my_setbuf(fp, buf);27 else /* 文件流是有緩沖的,調成無緩沖 */28 my_setbuf(fp, NULL); 29 30 printf("After setbuf.../n");31 pr_stdio(filename, fp); /* 關閉了緩沖 */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函數,要么打開,要么關閉,是全緩沖還是行緩沖決定于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) /* 與終端設備相關,應設為行緩沖 */61 setvbuf(fp, buf, _IOLBF, BUFSIZ);62 else /* 設為全緩沖 */63 setvbuf(fp, buf, _IOFBF, BUFSIZ);64 65 }View Code
結果如下:
新聞熱點
疑難解答