APUE读书笔记(6) 标准IO库(上)

第五章 标准IO库(上)

一:主要内容:
  本章主要讲述UNIX系统中标准IO库的实现,包括缓冲区的分配、流的概念、标准IO的效率等。
二:流和FILE对象
  对于流来说,他又两种模式。我们先不说这两种模式是什么,先来讨论一下字符集。我们通常所使用的字符集为ANSI字符集,ANSI字符集相比较于ASCII字符集多出了一部分数据,这里主要是因为原有的ASCII字符集仅仅适用于英语,不适用于其他语言,所以ANSI字符集增加了其他国家的语言字符。但是对于不同国家对于自己国家的语言编码有着自己的规则,如果一个文件中既有汉语,又有日语,但是计算机对于数字仅仅只能使用一种解码规则,这时候就会出现乱码。为了解决不同国家的ANSI的编码问题,Unicode码出现了,Unicode编码规则使用两个字节表示一个字符。对于一个字节表示的ANSI码和两个字节表示的Unicode编码,分别对应窄字节和宽字节。
  流的定向正是规定了所读写的流是单字节还是双字节的。那么当一个流被创建的时候是没有定义流的定向的,需要使用函数fwide来设置。

int fwide(FILE *fp, int mode);
如果返回值为正,则流为宽定向;如果返回值为负,则流为窄定向;如果是0,说明流为定向。

三:标准输入、标准输出和标准错误
  对于这三个流,分别对应0,1,2。我们常看到一个命令,2>&1,标识了将标准错误重定向到标准输出。
四:缓冲
  缓冲的作用是为了减少read和write函数的调用次数,以此希望提高程序的效率。标准IO提供三种类型的缓冲:全缓冲,行缓冲和不带缓冲。
  全缓冲意味着只有缓冲被打满或者强制执行flush函数才会进行IO操作。
  行缓冲意味着当缓冲遇到了换行符就会执行IO操作,但是显而易见的是行缓冲也是有一个固定大小的,如果缓冲已经达到了这个大小但是还是没有遇到换行符也是会执行IO操作的。
  不带缓冲意味着立即就可以进行输出。标准错误流使用的就是不带缓冲方式。
五:打开流
  打开流的函数有三个,如下所示。

#include <stdio.h>
FILE *fopen(const char *restrict pathname,const char *restrict type)
FILE *freopen(const char *restrict pathname,const char *restrict type,FILE *restrict fp);
FILE *fdopen(int fd,const char *type);
                                   单个函数的返回值:若成功,返回文件指针;若出错,返回NULL

  fopen:用于打开一个特定的文件
  freopen:在特定的流上打开特定的文件,主要用于实现重定向功能。如果流已经被打开,则先关闭它,如果流已经被含有定向设置,则清除它,重新进行设置。经常用在标准输入流、标准输出流、标准错误流的操作。(eg:标准输出重定向到一个文件)
  fdopen:使打开的文件描述符与标准I/O流向结合。这里的文件描述符可能来自open、dup、dup2、pipe、fcntl等。很多文件只能由网络通信或者创建管道获得的文件描述符,无法直接使用fopen函数。这些特殊的文件打开后就需要与标准I/O流向结合,因此需要fdopen函数。
  对于打开的方式,主要是规定读写和文件的偏移量的。比如r为读,w为写并把偏移量置为0,a为追加,也就是写并且不改变偏移量。对于有+号的类型,代表了同时有读和写的方式,通过w,r,a和有无加号的组合,一共有六种打开文件的方式。
六:读和写流
  输入函数包括下面三种。

#include <stdio.h>
int getc(FILE *fp);
int fgetc(FILE *fp);
int getchar(void);
 
//返回值:若成功则为下一个字符,若已处文件尾端或出错则为EOF

  其中getchar等于getc(stdin),getc和fgetc的唯一区别就是getc可以被实现为一个宏,这意味着:
  1.getc的参数最好不要为表达式,因为会被计算多次。
  2.fgetc具有地址,可以被传入到其他函数。
  3.getc的调用时间一般要短于fgetc,因为调用宏的时间一般短于调用函数。
  从流种读数据到末尾和遇到错误,这三个函数都会返回同样的值,为了区分这两种情况,下面两个函数被引用。

int ferror(FILE *fp);
int feof(FILE *fp);
两个函数返回值:若条件为真,返回非0;否则返回0。
void clearerr(FILE *fp);
清楚错误标志。

  输出函数包括下面三种。

#include <stdio.h>
int putc(int c, FILE *fp);
int fputc(int c, FILE *fp);
int putchar(int c);
 
//返回值:若成功则为 C,若出错则为EOF

  这三个函数的区别与输入函数是一样的,就不具体介绍了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值