您的位置:首页 > 产品设计 > UI/UE

《APUE》第五章练习1

2015-02-05 13:40 225 查看
题目:用setvbuf实现setbuf。

这两个函数都是改变流的缓冲模式的。函数原型如下:

#include <stdio.h>

void setbuf(FILE *fp, char *buf);

void setvbuf(FILE *fp, char *buf, int mode, size_t size);

毫无疑问,setvbuf是setbuf的升级版。下面我们再看看这两个函数是怎么工作的:

/* 用setvbuf来实现setbuf */
#include <stdio.h>
#include <stdlib.h>

void pr_stdio(const char *, FILE *);
void my_setbuf(FILE *, char *);

int main(void)
{
char    buf[BUFSIZ];
char    filename[BUFSIZ];
FILE    *fp;

printf("Please input a filename:");
scanf(" %s", filename);

if ((fp = fopen(filename, "r")) == NULL)    /* 打开文件 */
{
printf("fopen error");
exit(1);
}

pr_stdio(filename, fp);    /* 查看是什么缓冲,一般是全缓冲 */

if (fp->_IO_file_flags &_IO_UNBUFFERED )    /* 文件流是无缓冲的,调成有缓冲 */
my_setbuf(fp, buf);
else                        /* 文件流是有缓冲的,调成无缓冲 */
my_setbuf(fp, NULL);

printf("After setbuf...\n");
pr_stdio(filename, fp);    /* 关闭了缓冲 */

return 0;
}

void pr_stdio(const char *pathname, FILE *fp)
{
printf("stream = %s, ", pathname);

if (fp->_IO_file_flags & _IO_UNBUFFERED)    /* 无缓冲 */
printf("unbuffered\n");
else if (fp->_IO_file_flags & _IO_LINE_BUF)    /* 行缓冲 */
printf("line buffered\n");
else                        /* 全缓冲 */
printf("fully buffered\n");
}

void my_setbuf(FILE *fp, char *buf)    /* setbuf函数,要么打开,要么关闭,是全缓冲还是行缓冲决定于fp */
{
int    fd;

fd = fileno(fp);    /* 获取文件描述符 */

if (buf == NULL)    /* 修改为无缓冲 */
{
setvbuf(fp, buf, _IONBF, BUFSIZ);
return;
}

if (fd == 0 || fd == 1 || fd == 2)    /* 与终端设备相关,应设为行缓冲 */
setvbuf(fp, buf, _IOLBF, BUFSIZ);
else                    /* 设为全缓冲 */
setvbuf(fp, buf, _IOFBF, BUFSIZ);

}


View Code
结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: