输入和输出是通过read和write系统调用实现的(调用系统的功能),在C语言程序中,可以通过函数read和write访问这两个系统调用.这两个函数中,第一个参数是文件描述符,第二个参数是程序中存放读或写数据的字符数组,第三个参数是要传输的字节数.
每个调用返回实际传输的字节数.在读文件时,函数的返回值可能会小于请求的字节数,如果返回值为0,则表示已到达文件的结尾:如果返回值为-1,则表示发生了某种错误.在写文件时,返回值是实际写入的字节数,如果返回值与请求写入的字节数不相等则说明发生了错误.
在单次调用中,读出或写入的数据的字节数可以为任意大小.最常用的值为1,即每次读出或写入1个字符(无缓冲),或是类似于1024或4098这样的与外围设备的物理块大小相应的值,用更大的值调用函数可以获得更高的效率,因为系统调用的次数少了.
下面那个程序例子懒得写了,0是标准输入,1是标准输出.然后那个重定向是由外面的系统>和<来实现的.
系统调用的函数原型集中放在头文件syscalls.h中.
BUFSIZ是一个常量,是系统自带的.如果文件大小不是这个BUFSIZ的倍数(因为每次调用都只读取BUFSIZ个字符,所以最后一次就会返回另一个值,这个值就是最后读取的字符数),然后最后一次写就通过这个值去写.(然后文件到末尾read返回0,判断式为假,终止程序.)
getchar函数.
就是通过read向0(标准输入读取字符)判断返回值是否为1(因为read的第三个参数每次读取数量就是1),如果为1,向调用getchar的函数返回读入的这个c(c必须是变量,用于保存read读入的字符还因为read需要地址.).否则返回EOF.
第二个getchar函数
static对外隐藏数组和指针.并且在程序运行过程中不重置数组和指针的内容.
但是这个程序真的只是返回一个字符的.
read读取后放入buf数组中.变量n改变为不等于0.
return只返回了bufp++那个字符,
之后每次调用都会从buf数组中返回值(bufp++是buf数组的下一个字符).
如果n等于0的话就是缓冲区中已经没有字符了.所以要将bufp这个遍历buf数组的指针初始化为buf开头的位置.
读入一组只返回一个不知道在哪能用到.
网友评论