int putc(int c,FILE * stream);
int getc(FILE * stream);
STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO 对应的数值分别是0,1,2。这些常量是int型,都定义在unistd.h中。
stdin、stdout、stderr都是File *类型。
stdin与STDIN_FILENO一般指键盘,而stdout与STDOUT_FILENO指显示器。
下面代码 将标准输入复制到标准输出
#include <stdio.h>
#include <unistd.h>
#define BUFFSIZE 4096
int main()
{
int n;
char buf[BUFFSIZE];
while((n=read(STDIN_FILENO,buf,BUFFSIZE))>0)
if(write(STDOUT_FILENO,buf,n)!=n)
{
printf("write error!");
return ;
}
if(n<0){
printf("read error!");
return ;}
exit(0);
}
注:函数open read write lseek 以及 close提供不用缓冲的I/O,这些函数都是使用文件描述符。
用标准I/O将标准输入复制到标准输出
#include <stdio.h>
int main()
{
int c;
while((c=getc(stdin))!=EOF)
if(putc(c,stdout)==EOF){
printf("output error!");
return;}
if(ferror(stdin)){
printf("input error!");
return ;}
exit(0);
}
注:标准I/O库的一个问题是效率不高,(f开头的函数)通常需要复制两次数据,一次是在内核和标准I/O缓冲之间,另一次是标准I/O缓冲区和用户程序中的行缓冲区之间。