文件描述符
通常是一个小的非负整数,也就是说0,1等
标准输入,标准输出和标准错误
standard input,standard output,standard error,在不做特殊处理的情况下,3个描述符都链接到终端,也就是说,我们用终端输入,输出和输出错误,使用 < >符号来重定向输入源和输出目的。
不带缓冲的I/O
函数open,read,write,lseek以及close提供了不带缓冲的I/O,这些函数都使用文件描述符。
#include "apue.h" #define BUFFSIZE 4096 int main(void){ int n; char buf[BUFFSIZE]; while((n=read(STDIN_FILENO,buf,BUFFSIZE))>0) if(write(STDOUT_FILENO,buf,n)!=n) err_sys("write error"); if(n<0) err_sys("read error"); exit(0); }
以上是一个复制文件的程序实例。
重点代码(4.1仅笔者自己理解,不作为读者参考):
4.1
n=read(STDIN_FILENO,buf,BUFFSIZE)
STDIN_FILENO:是一个常量,POSIX标准的一部分,在unistd.h中定义,实际值为0,表示从输入源中读取最大为BUFFSIZE长度的内容到buf中,n表示读入数据的长度,如果n大于0,则写入到标准输出:
write(STDOUT_FILENO,buf,n)
STDOUT_FILENO跟STDIN_FILENO一样都是一个常量,实际值为1,如无重定向,则从buf中写入n个字符到标准输出,返回值如果不等于n则输出错误。
输入ctrl+d结束输入。
4.2 重定向输入源和输出目的。
./a.out <infile>outfile
将infile中的内容读入,并写入到outfile,实现文件复制。
4.3 使用标准I/O
标准I/O函数为那些不带缓冲的I/O函数提供了一个带缓冲的接口,标准io头文件 stdio.h(忍不住吐槽下,虽然是高级编程,但是开篇例程并未引入标准io,后面再逐渐提及而且说的比较明白,比谭浩强的书更易懂一些。)
fgets:读取一行
getc:读取一个字符,getc(stdin);
putc:输出一个字符到标准输出,putc(c,stdout):输出c到标准输出
#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");
exit(0);
}
使用标准io的代码跟不带缓冲的io比起来,参数比较少,写明的stdin和stdout也更容易阅读。
一点个人思考,c代码中经常见到在while,if等条件中执行语句的书写方式,通常表示默认执行,如果满足/不满足条件再执行后面的语句,与c入门时的思维方式或者其他语言例程差别比较大,需得适应这种代码书写方式,要用好这种书写方式应该要多熟悉标准库函数原型,能够更好的利用函数的返回值作为判断条件,减少变量的定义,使代码更加整洁。
来源:oschina
链接:https://my.oschina.net/u/2491285/blog/534501