国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 操作系統(tǒng) > 正文

《APUE》第五章練習(xí)1

2024-06-28 13:22:07
字體:
供稿:網(wǎng)友
《APUE》第五章練習(xí)1

題目:用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é)果如下:


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 永吉县| 林芝县| 栖霞市| 霍邱县| 历史| 宾川县| 乐安县| 荥经县| 莱州市| 沙坪坝区| 郑州市| 株洲市| 凤翔县| 乌苏市| 天镇县| 昆山市| 汾西县| 张家口市| 集贤县| 平山县| 沛县| 鞍山市| 永靖县| 晋江市| 昌江| 锡林浩特市| 都安| 漠河县| 隆尧县| 静海县| 英吉沙县| 宁都县| 安康市| 嵩明县| 德庆县| 临安市| 余庆县| 长垣县| 合阳县| 富顺县| 黎城县|