Advanced Programming in UNIX Environment Episode 21

一旦打开了流,有三种方式。
(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将标准输入复制到标准输出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值