y第五章讲述的是标准IO库和各种相关函数 |
5.2流和FILE对象 |
对于标准IO库,他们的操作是围绕流进行的;当一个流刚被创建时,是没有流的定向的,可以通过下面函数改变:i |
|
mode < 0 ,则fwide试图使指定的流是字节定向的; |
mode > 0,fwide试图将使指定的流是正向的; |
mode = 0 fwide不设置流的定向,返回标识该流定向的值; |
|
5.3 标准输入和标准输出和标准错误 |
为一个进程定义了三个文件流: stdin,stdout,stderr,而文件描述符有对应的三个:STDIN_FIENO,STDOUT_FILENO,STDERR_FILE;包含在<unistd.h>头文件中; |
5.4 |
缓冲有三中类型:全缓冲,行缓冲,不带缓冲;每当第一次执行IO时候,标准函数使用malloc来获得缓冲区; |
值得注意的是每当通过标准IIO库从一个不太缓冲的流或者行缓冲得到输入数据,那么就会刷新所有行缓冲输入流;在课后习题中也考得了这一点; |
我们可以自己更该缓冲类型,用下面两个函数: |
int setbuf(FILE* restrivt_fp, char* restrictbuf); |
int setvbuf(FILE* restrict_fp, char* restrict_buf,int mode, size_t size); |
mode : _IOFBF, _IOLBUF, _IONBF |
成功返回0,出错返回非0 |
强制冲洗一个流: 若FILE是NULL,则将导致所有输出流被冲洗; |
5.5打开一个流 |
用三个函数打开流:
|
值得注意的是:1,freopen是重定向流,将fp重定向到pathname; |
2,fdopen是文件描述符与流结合;其实流是封装的文件描述符; |
对于符fdopen,type有一点区别。因为文件描述符已经被打开,所以打开的时候O_TRUNC决定是否截断该文件。 |
fdopen不能截断任何为他为写而打开的任意文件; |
当以讀寫中类型打开文件时,具有以下限制: |
如果中间没有fflush,fseek,fsetpos,rewind,则在输出的后面不能直接跟输入。 |
如果中间没有fseek,fsetpos,rewind,或者一个输入操作没有到达文件尾端,则在输入操作之后不能跟随输出。 |
关闭一个文件流:
|
5.6读和写流 |
有三种不同类型的非格式化I/O中选择: |
1,每次一个字符的I/O. |
2,每次一行的i/o. |
3,直接I/o |
每次一个字符的函数: |
读:
|
getc被实现位宏,而fgetc没有被实现宏; |
无论是出错还是返回值,三个函数都返回EOF,用以三个函数处理, |
|
从流中读取文件,ungetc函数将字符压入流中(只是将字符压入缓冲区,未写到磁盘上) |
|
输出函数: |
void clearerr(FILE* fp);
int putc(int c, FILE* fp);
int fputc(int c,FILE* fp);
int putchar(int c);
成功返回C,失败返回EOF;
5.7每次一行IO
输入一行的函数:char* fgets(char* restrict_buf, int n, FILE *restrict_buf);
char* gets(char* buf);
fgets将换行符存入缓冲区,而gets不将换行符存入缓冲区。
若成功,则返回buf,若不成功(出错或到达文件尾端)则返回EOF.
缓冲区总是以null字节结尾。
输出一行的函数:int fputs(const char* restrict_str,FILE* restrict_fp );int puts(const char* str);函数fputs将一个以null字节终止的字符串写到指定流,尾端的终止符null不写出。并不是每次输出一行,因为换行符不一定是最后一个非NULL的字节。