Advanced Programming in UNIX Environment Episode 21
2018-01-03 21:29
543 查看
一旦打开了流,有三种方式。
(1)每次一个字符的I/O。
(2)每次一行的I/O。
(3)直接I/O。
直接I/O(direct I/O)这个属于来自ISO C标准,有时也被称为:二进制I/O、一次一个对象I/O、面向记录的I/O或面向结构的I/O。
输入函数
函数getchar等同于getc(stdin)。前两个函数的区别是,getc可被实现为宏,而fgetc不能实现为宏。则:
(1)getc的参数不应当是具有副作用的表达式,因为他可能会被计算多次。
(2)因为fgetc一定是个函数,所以可以得到其地址。这就允许将fgetc的地址作为一个参数传送给另一个函数。
(3)调用fgetc所需时间很可能比调用getc要长,因为调用韩束所需要的时间通常长于调用宏。
为了区分必须调用ferror或feof。
维护了两个标志:
* 出错标志
* 文件结束标志
调用clearerr可以清除这两个标志。
调用ungetc将字符再压送回流中。
压送回到流中的字符以后又可以从流中读出,但读出字符的顺序与压送回的顺序相反。
用ungetc压送回字符时,并没有将它们写到底层文件中或设备上,只是将它们协会标准I/O库的流缓冲区中。
输出函数
每次一行I/O
都指定了缓冲区的地址,读入的行将送入其中。gets从标准输入读,而fgets则从指定的流读。
fputs和puts提供每次输出一行的功能。
函数fputs将一个以null字节终止的字符串写到指定的流,尾端的终止符null不写出。
puts将一个以null字节种植的字符串写到标准输出,终止符不写出。
标准I/O的效率
用getc和putc将标准输入复制到标准输出
用fgets和fputs将标准输入复制到标准输出
(1)每次一个字符的I/O。
(2)每次一行的I/O。
(3)直接I/O。
直接I/O(direct I/O)这个属于来自ISO C标准,有时也被称为:二进制I/O、一次一个对象I/O、面向记录的I/O或面向结构的I/O。
输入函数
#include <stdio.h> int getc(FILE *fp); int fgetc(FILE *fp); int getchar(void);
函数getchar等同于getc(stdin)。前两个函数的区别是,getc可被实现为宏,而fgetc不能实现为宏。则:
(1)getc的参数不应当是具有副作用的表达式,因为他可能会被计算多次。
(2)因为fgetc一定是个函数,所以可以得到其地址。这就允许将fgetc的地址作为一个参数传送给另一个函数。
(3)调用fgetc所需时间很可能比调用getc要长,因为调用韩束所需要的时间通常长于调用宏。
为了区分必须调用ferror或feof。
#include <stdio.h> int ferror(FILE *fp); int feof(FILE *fp); void clearerr(FILE *fp);
维护了两个标志:
* 出错标志
* 文件结束标志
调用clearerr可以清除这两个标志。
调用ungetc将字符再压送回流中。
#include <stdio.h> int ungetc(int c, FILE *fp);
压送回到流中的字符以后又可以从流中读出,但读出字符的顺序与压送回的顺序相反。
用ungetc压送回字符时,并没有将它们写到底层文件中或设备上,只是将它们协会标准I/O库的流缓冲区中。
输出函数
#include <stdio.h> int putc(int c, FILE *fp); int fputc(int c, FILE *fp); int putchar(int c);
每次一行I/O
#include <stdio.h> char *fgets(char *restrict buf, int n, FILE *restrict fp); char *gets(char *buf);
都指定了缓冲区的地址,读入的行将送入其中。gets从标准输入读,而fgets则从指定的流读。
fputs和puts提供每次输出一行的功能。
#include <stdio.h> int fputs(const char *restrict str, FILE *restrict fp); int puts(const char *str);
函数fputs将一个以null字节终止的字符串写到指定的流,尾端的终止符null不写出。
puts将一个以null字节种植的字符串写到标准输出,终止符不写出。
标准I/O的效率
#include "apue.h" int main(void) { int c; while((c=getc(stdin))!=EOF) { if(putc(c,stdout)==EOF) err_sys("output error"); } if(ferror(stdin)) err_sys("input error"); return 0; }
用getc和putc将标准输入复制到标准输出
#include "apue.h" 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"); return 0; }
用fgets和fputs将标准输入复制到标准输出
相关文章推荐
- Advanced Programming in UNIX Environment Episode 5
- Advanced Programming in UNIX Environment Episode 18
- Advanced Programming in UNIX Environment Episode 9
- Advanced Programming in UNIX Environment Episode 15
- Advanced Programming in Unix Environment Episode 1
- Advanced Programming in UNIX Environment Episode 17
- Advanced Programming in UNIX Environment Episode 3
- Advanced Programming in UNIX Environment Episode 23
- Advanced Programming in Unix Environment Episode 2
- Advanced Programming in UNIX Environment Episode 7
- Advanced Programming in UNIX Environment Episode 24
- Advanced Programming in UNIX Environment Episode 10
- Advanced Programming in UNIX Environment Episode 25
- Advanced Programming in UNIX Environment Episode 12
- Advanced Programming in UNIX Environment Episode 13
- Advanced Programming in UNIX Environment Episode 14
- Advanced Programming in UNIX Environment Episode 11
- Advanced Programming in UNIX Environment Episode 16
- Advanced Programming in UNIX Environment Episode 4
- Advanced Programming in UNIX Environment Episode 6