Advanced Programming in UNIX Environment Episode 20
2017-12-23 19:23
543 查看
这一章讲述了I/O库。很多其他操作系统都实现了标准I/O库,这个库由ISO C标准说明。Single UNIX specification对ISO C标准进行了扩充,定义另外一些接口。
35年来,几乎没有对标准I/O库进行修改
freopen函数清除一个流的定向;fwide函数可用于设置流的定向。
mode参数值为负,fwide将试图使指定的流是字节定向的。
mode参数值为正,fwide将试图使指定的流是宽定向的。
mode参数为0,fwide将不试图设置流的定向,但返回标识该流定向的值。
3个流可以自动地被进程使用,分别是:标准输入、标准输出和标准错误。
3个标准I/O流通过预定文件指针stdin、stdout和stderr加以引用。这3个文件定义在头文件<stdio.h>中。
标准I/O提供了以下3种类型的操作。
(1)全缓冲
术语冲洗(flush)说明标准I/O缓冲区的写操作。
(2)行缓冲
(3)不带缓冲。
ISO C要求下列缓冲特征。
当且仅当标准输入和标准输出并不指向交互式设备时,他们才是全缓冲的。
标准错误绝不会是全缓冲的。
很多系统默认使用下列类型的缓冲:
标准错误是不带缓冲的。
若是指向终端设备的流,则是行缓冲的;否则就是全缓冲的。
对任何一个给定的流,如果我们不喜欢这些系统默认,可以调用下列两个函数中的一个更改缓冲类型。
这是用mode参数实现的:
_IOFBF 全缓冲
_IOLBF 行缓冲
_IONBF 不带缓冲
任何时候,我们都可强制冲洗一个流。
打开一个标准I/O流
区别如下:
(1)fopen函数打开路径名为pathname的一个指定的文件。
(2)freopen函数在一个指定的流上打开一个指定的文件,如若该流已经打开,则先关闭该流。若该流已经定向,则使用freopen清除该定向。此函数一般用于将一个指定的文件打开为一个预定义的流:标准输入、标准输出或标准错误。
(3)fdopen函数取一个已有的文件描述符(我们可能从open、dup、dup2、fcntl、pipe、socket、scoketpair或accept函数得到此文件描述符),并使一个标准I/O流与该描述符相结合。
fopen和freopen是ISO C的所属部分。而ISO C并不涉及文件描述符,所以仅有POSIX.1具有fdopen。
当以读和写类型打开一个文件时(type中+号),具有下列限制。
如果中间没有fflush、fseek、fsetpos或rewind,则在输出的后面不能直接跟随输入。
如果中间没有fseek、fsetpos或rewind,或者一个输入操作没有到达文件尾随,则在输入操作之后不能直接跟随输出。
调用fclose关闭一个打开的流。
35年来,几乎没有对标准I/O库进行修改
freopen函数清除一个流的定向;fwide函数可用于设置流的定向。
#include <stdio.h> #include <wchar.h> int fwide(FILE *fp, int mode);
mode参数值为负,fwide将试图使指定的流是字节定向的。
mode参数值为正,fwide将试图使指定的流是宽定向的。
mode参数为0,fwide将不试图设置流的定向,但返回标识该流定向的值。
3个流可以自动地被进程使用,分别是:标准输入、标准输出和标准错误。
3个标准I/O流通过预定文件指针stdin、stdout和stderr加以引用。这3个文件定义在头文件<stdio.h>中。
标准I/O提供了以下3种类型的操作。
(1)全缓冲
术语冲洗(flush)说明标准I/O缓冲区的写操作。
(2)行缓冲
(3)不带缓冲。
ISO C要求下列缓冲特征。
当且仅当标准输入和标准输出并不指向交互式设备时,他们才是全缓冲的。
标准错误绝不会是全缓冲的。
很多系统默认使用下列类型的缓冲:
标准错误是不带缓冲的。
若是指向终端设备的流,则是行缓冲的;否则就是全缓冲的。
对任何一个给定的流,如果我们不喜欢这些系统默认,可以调用下列两个函数中的一个更改缓冲类型。
#include <stdio.h> void setbuf(FILE *restrict fp, char *restrict buf); int setvbuf(FILE *restrict fp, char *restrict buf, int mode, size_t size);
这是用mode参数实现的:
_IOFBF 全缓冲
_IOLBF 行缓冲
_IONBF 不带缓冲
函数 | mode | buf | 缓冲区及长度 | 缓冲类型 |
---|---|---|---|---|
setbuf | 非空 | 长度为BUFSIZ的用户缓冲区buf | 全缓冲或行缓冲 | |
NULL | (无缓冲区) | 不带缓冲 | ||
setvbuf | _IOFBF | 非空 | 长度为size的用户缓冲区buf | 全缓冲 |
NULL | 合适长度的系统缓冲区buf | |||
_IOLBF | 非空 | 长度为size的用户缓冲区buf | 行缓冲 | |
NULL | 合适长度的系统缓冲区buf | |||
_IONBF | 忽略 | (无缓冲区) | 不带缓冲 |
#include <stdio.h> int fflush(FILE *fp);
打开一个标准I/O流
#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);
区别如下:
(1)fopen函数打开路径名为pathname的一个指定的文件。
(2)freopen函数在一个指定的流上打开一个指定的文件,如若该流已经打开,则先关闭该流。若该流已经定向,则使用freopen清除该定向。此函数一般用于将一个指定的文件打开为一个预定义的流:标准输入、标准输出或标准错误。
(3)fdopen函数取一个已有的文件描述符(我们可能从open、dup、dup2、fcntl、pipe、socket、scoketpair或accept函数得到此文件描述符),并使一个标准I/O流与该描述符相结合。
fopen和freopen是ISO C的所属部分。而ISO C并不涉及文件描述符,所以仅有POSIX.1具有fdopen。
type | 说明 | open标志 |
---|---|---|
r或rb | 为读而打开 | O_RDONLY |
w或wb | 把文件截断至0长,或为写而创建 | O_WRONLY|O_CREAT|O_TRUNC |
a或ab | 追加:为在文件尾写而打开 | O_WRONLY|O_CREAT|O_APPEND |
r+或r+b或rb+ | 为读和写而打开 | O_RDWR |
w+或w+b或wb+ | 把文件截断至0长,或为读和写而打开 | O_RDWR|O_CREAT|O_TRUNC |
a+或a+b或ab+ | 为在文件尾读和写而打开或创建 | O_RDWR|O_CREAT|O_APPEND |
如果中间没有fflush、fseek、fsetpos或rewind,则在输出的后面不能直接跟随输入。
如果中间没有fseek、fsetpos或rewind,或者一个输入操作没有到达文件尾随,则在输入操作之后不能直接跟随输出。
调用fclose关闭一个打开的流。
#include <stdio.h> int fclose(FILE *fp);
相关文章推荐
- Advanced Programming in UNIX Environment Episode 22
- Advanced Programming in UNIX Environment Episode 13
- Advanced Programming in UNIX Environment Episode 10
- Advanced Programming in UNIX Environment Episode 4
- Advanced Programming in UNIX Environment Episode 23
- Advanced Programming in UNIX Environment Episode 7
- Advanced Programming in Unix Environment Episode 1
- Advanced Programming in Unix Environment Episode 2
- Advanced Programming in UNIX Environment Episode 21
- Advanced Programming in UNIX Environment Episode 11
- Advanced Programming in UNIX Environment Episode 16
- Advanced Programming in UNIX Environment Episode 3
- Advanced Programming in UNIX Environment Episode 12
- Advanced Programming in UNIX Environment Episode 26
- Advanced Programming in UNIX Environment Episode 24
- Advanced Programming in UNIX Environment Episode 9
- Advanced Programming in UNIX Environment Episode 15
- Advanced Programming in UNIX Environment Episode 6
- Advanced Programming in UNIX Environment Episode 25
- Advanced Programming in UNIX Environment Episode 5