unix高级环境编程 例子 代码实现练习 第五章:标准IO的效率

程序清单 5-1 用getc和putc将标准 P117

/**
 * 程序清单 5-1 用getc和putc将标准 P117
 *
 * zy:
 * 代码简单到我都不想再敲一遍,作者做了这么多,
 * 最关键的就是想说:
 * 标准IO库与直接调用read和write函数相比并不会慢非常多。
 * 对于应用程序来说,主要是应用业务消耗了非常多的时间,而不是IO。
 *
 */
#include "apue.h"
#include "error.c"


int main(void) {
    int c;
    while((c=getc(stdin))!=EOF){
        if(putc(c,stdout)==EOF){
            err_sys("write error");
        }
    }
    if(ferror(stdin)){
        err_sys("read error");
    }
    exit(0);
}

程序清单 5-2 用fgets和fputs将标准 P117

/**
 * 程序清单 5-2 用fgets和fputs将标准 P117
 *
 * zy:
 * 代码简单到我都不想再敲一遍,作者做了这么多,
 * 最关键的就是想说:
 * 标准IO库与直接调用read和write函数相比并不会慢非常多。
 * 对于应用程序来说,主要是应用业务消耗了非常多的时间,而不是IO。
 *
 */
#include "apue.h"
#include "error.c"

int main(void) {
    char buf[MAXLINE];
    while((fgets(buf,MAXLINE,stdin))!=NULL){//这次是一行一行的读取
        if(fputs(buf,stdout)==EOF){
            err_sys("output error");
        }
    }
    if(ferror(stdin)){
        err_sys("input error");
    }
    exit(0);
}

程序清单 5-3 对各个标准IO流打印缓冲状态信息 P125

/**
 * 程序清单 5-3 对各个标准IO流打印缓冲状态信息 P125
 *
 * zy:
 * 系统默认的情况是:
 * 标准输入和输出链接终端时,它们是行缓冲的,缓冲字节长度为1024
 * 当将流定位到普通文件,那么其变为了全缓冲的,缓冲长度为stat结构里面的st_blksize
 */
#include "apue.h"
#include "error.c"

void pr_stdio(const char *,FILE *);

int main(void) {
	FILE *fp;
	fputs("enter any character \n",stdout);
	if(getchar()==EOF){
		err_sys("getchar error");
	}
	fputs("one line to standard error\n",stderr);

	pr_stdio("stdin",stdin);
	pr_stdio("stdout",stdout);
	pr_stdio("stderr",stderr);

	if((fp=fopen("/etc/motd","r"))==NULL){
		err_sys("fopen error");
	}
	if(getc(fp)==EOF){
		err_sys("getc error");
	}
	pr_stdio("/etc/motd",fp);
    exit(0);
}

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

	if(fp->_IO_file_flags&_IO_UNBUFFERED){//这些都存在于libio.h文件中
		printf("unbuffered");
	}else if(fp->_IO_file_flags&_IO_LINE_BUF){
		printf("line buffered");
	}else {
		printf("fully buffered");
	}
	printf(", buffer size = %d \n",fp->_IO_buf_end-fp->_IO_buf_base);
}

结果:

asd@asd-desktop:~/workspace/test/src$ gcc test.c 
asd@asd-desktop:~/workspace/test/src$ ./a.out 
enter any character 

one line to standard error
stream = stdin, line buffered, buffer size = 1024 
stream = stdout, line buffered, buffer size = 1024 
stream = stderr, unbuffered, buffer size = 1 
stream = /etc/motd, fully buffered, buffer size = 4096 
asd@asd-desktop:~/workspace/test/src$ ./a.out <input >output 2>errorout 
asd@asd-desktop:~/workspace/test/src$ cat errorout 
one line to standard error
asd@asd-desktop:~/workspace/test/src$ cat output 
enter any character 
stream = stdin, fully buffered, buffer size = 4096 
stream = stdout, fully buffered, buffer size = 4096 
stream = stderr, unbuffered, buffer size = 1 
stream = /etc/motd, fully buffered, buffer size = 4096 
asd@asd-desktop:~/workspace/test/src$ 

程序清单 5-4 tmpnam和tmpfile P127

/**
 * 程序清单 5-4 tmpnam和tmpfile P127
 *
 * zy:
 * tmpnam可以传入空指针,让临时文件的名字返回
 * 也可以给其指定区域
 * tmpfile是创建一个二进制文件
 */
#include "apue.h"
#include "error.c"

int main(void) {
	char name[L_tmpnam],line[MAXLINE];
	FILE *fp;

	printf("%s \n ",tmpnam(NULL));
	tmpnam(name);

	printf("%s \n ",name);
	if((fp=tmpfile())==NULL)
		err_sys("tmpfile error");

	fputs("one line\n",fp);
	rewind(fp);//功 能: 将文件内部的位置指针重新指向一个流(数据流/文件)的开头

	if(fgets(line,sizeof(line),fp)==NULL){
		err_sys("fgets error");
	}
	fputs(line,stdout);

}
结果:

asd@asd-desktop:~/workspace/test/src$ gcc test.c 
asd@asd-desktop:~/workspace/test/src$ ./a.out 
/tmp/fileDW9gBJ 
 /tmp/filepbmv4y 
 one line
asd@asd-desktop:~/workspace/test/src$ 

程序清单 5-5 演示tempnam函数 P128

/**
 * 程序清单 5-5 演示tempnam函数 P128
 *
 * zy:
 * 作为temnam函数的变体,它允许调用者为所产生的路径名制定目录和前缀
 */
#include "apue.h"
#include "error.c"

int main(int argc, char *argv[]) {
	if(argc!=3)
		err_quit("usage:a.out <directory> <prefix>");
	printf("%s \n", tempnam(argv[1][0]!=' '? argv[1] :NULL,argv[2][0]!=' '?argv[2] : NULL));//argv[1][0]取第二个参数的地一个字符
}
结果:
asd@asd-desktop:~/workspace/test/src$ ./a.out ./ asd
./asdFpdfpd 
asd@asd-desktop:~/workspace/test/src$ ./a.out " " asd
/tmp/asdRtHpW1 
asd@asd-desktop:~/workspace/test/src$ 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值