程序清单 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$