国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 乌什县| 四平市| 邻水| 桑植县| 社会| 长汀县| 康平县| 沙河市| 鄢陵县| 民县| 手机| 沙坪坝区| 庐江县| 射洪县| 平谷区| 山东省| 望谟县| 潞西市| 土默特左旗| 阿拉善盟| 平昌县| 吴江市| 商都县| 屏东市| 三明市| 正安县| 洪洞县| 当雄县| 芒康县| 称多县| 南阳市| 罗城| 定州市| 临西县| 靖西县| 兖州市| 会昌县| 巴里| 晴隆县| 建湖县| 沅江市|